【问题标题】:prevent null pointer in map() reduce() of java 8 for BigDecimal additions [duplicate]防止Java 8的map()reduce()中的空指针用于BigDecimal添加[重复]
【发布时间】:2021-03-02 14:48:08
【问题描述】:

我正在尝试将给定产品的所有价格添加为:

 BigDecimal getTotalPrice(List<Product> products) {
        return products.stream()
                .map(Product::getPrice)
                .peek(bigDecimal -> System.out.println(bigDecimal))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

我尝试打印bigDecimal 的所有值,每当我们得到null 的值时,我们就会得到java.lang.NullPointerException,有没有更好的方法通过防止任何类型的异常来添加java 8

【问题讨论】:

  • 如果你想过滤掉它们,在reduce之前添加.filter(bigDecimal -&gt; bigDecimal != null).filter(Objects::nonNull)
  • 可以在map前使用filter操作符,可以过滤products.stream() .filter(x->x!=null) .map(Product::getPrice) .peek(bigDecimal -> System .out.println(bigDecimal)) .reduce(BigDecimal.ZERO, BigDecimal::add);或者你可以使用可选包装器 .map(x-> Optionale.ofNullable(x.getPrice).orElse(0))
  • 注意你可以说peek(System.out::println)

标签: java collections java-8 java-stream


【解决方案1】:

我建议添加中间过滤步骤:

return products.stream()
               .filter(Objects::nonNull) // If products can contain null values
               .map(Product::getPrice)
               .filter(Objects::nonNull) // If price can be null
               .peek(bigDecimal -> System.out.println(bigDecimal))
               .reduce(BigDecimal.ZERO, BigDecimal::add);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多