给出要总结的值列表。
List<CartItems> cartItems = ...
BigDecimal totalWeight = cartItems.stream().reduce(BigDecimal.ZERO, (weight, cart)
-> weight.add(cart.getProduct().getWeight().multiply(BigDecimal.valueOf(cart.getQty()))), BigDecimal::add)
.setScale(SCALE, RoundingMode.HALF_UP);
此处,cart.getProduct().getWeight()
可能随时null
,因为它是可选字段。因此,如果其中一个项目在java.lang.NullPointerException
类型的null
字段中包含weight
值,则会抛出java.math.BigDecmial
。
当给定集合中的项目包含java.lang.NullPointerException
值而非强制执行如下所述的恶意条件检查时,避免null
被抛出的最简洁方法是什么?
BigDecimal totalWeight = products.stream().reduce(BigDecimal.ZERO, (weight, cart)
-> weight.add(cart.getProduct().getWeight() == null ? BigDecimal.ZERO : cart.getProduct().getWeight().multiply(BigDecimal.valueOf(cart.getQty()))), BigDecimal::add)
.setScale(SCALE, RoundingMode.HALF_UP);
同样,以下内容也会抛出java.lang.NullPointerException
,因为给定的列表中包含null
值。
List<Integer> list = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
add(null);
add(5);
}};
Integer sum = list.stream().reduce(0, Integer::sum); // Or
//Integer sum = list.stream().reduce(0, (a, b) -> a + b);
System.out.println("sum : " + sum);
答案 0 :(得分:3)
我认为问题更多的是减少。你尝试在一个函数中做很多事情。据我了解,您希望每辆车的总和为weight*qty
。我会像这样削减操作:
BigDecimal totalWeight = cartItems.stream()
.filter(cart -> cart != null
&& cart.getProduct() != null
&& cart.getProduct().getWeight() != null)
.map(cart -> cart.getProduct().getWeight().multiply(BigDecimal.valueOf(cart.getQty())))
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(SCALE, RoundingMode.HALF_UP);
答案 1 :(得分:1)
以下是针对此问题的几种解决方案。
List<Integer> list = Arrays.asList(new Integer[]{
1,
2,
3,
(Integer)null,
5,
});
Integer sum = list.stream().map(i -> i != null ? i : 0).reduce(0, Integer::sum);
或
list.replaceAll(s -> s == null ? 0 : s);
Integer sum = list.stream().reduce(0, Integer::sum);
答案 2 :(得分:0)
你可以这样做:
Integer sum = list.stream().filter(Objects::nonNull).reduce(0, Integer::sum);
再见!