【问题标题】:Returning default list if the list is empty using java 8 Streams?如果列表为空,则使用 java 8 Streams 返回默认列表?
【发布时间】:2020-02-05 03:57:53
【问题描述】:

有什么办法可以让下面的操作作为一组流操作执行,而不是显式检查如果推荐产品为空则返回默认列表,否则返回过滤后的列表

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

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

    return recommededProducts;
}

【问题讨论】:

  • 你现有的代码有什么问题?
  • @AndyTurner 同意。代码很好。我要做的唯一改进是使用 三元运算符 而不是 if-else 语句。不过,这仍然是一个品味问题。
  • @ETO 没有错,但我试图/希望找出是否有一种方法可以仅通过使用流 API 而不进行显式条件检查。感谢您的回复 - 我喜欢三元运算符的建议。

标签: java collections java-8 java-stream optional


【解决方案1】:

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

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

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

【讨论】:

    【解决方案2】:

    你可以试试这个:

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

    【讨论】:

      【解决方案3】:

      是的,使用Optional

      return Optional.of(this.newProducts.stream()
                                         .filter(isAvailable)
                                         .collect(Collectors.toList()))
                          .filter(l->!l.isEmpty())
                          .orElse(DEFAULT_PRODUCTS);
      

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 2016-11-16
        相关资源
        最近更新 更多