如果使用Java 8 Streams列表为空,则返回默认列表?


9

有什么办法可以将以下操作作为一组流操作执行,而不是显式检查RecommendationProducts 是否为空,然后返回默认列表,否则返回过滤后的列表

public List<Product> getRecommendedProducts() {
    List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.toList());

    if (recommendedProducts.isEmpty()) {
        return DEFAULT_PRODUCTS;
    }

    return recommededProducts;
}

4
您现有的代码有什么问题?
安迪·特纳

@AndyTurner同意。该代码是好的。我要做的唯一改进是使用三元运算符而不是if-else语句。虽然这仍然是一个品味问题。
ETO

@ETO没错,但是我试图/希望找出是否有办法仅通过使用不带显式条件检查的Stream API来做到这一点。感谢您的答复-我喜欢三元运算符的建议。
user3495691

Answers:


5

您可以尝试以下方法:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));

5

尽管您可以使用实现目标Optional,但我仍然会选择普通的三元运算符。

在这种特殊情况下,它更有意义并提高了可读性:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

是的,使用 Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.