给定要汇总的值列表。
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
type字段中包含值,则将抛出a 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);
我认为问题更多在于减少。您尝试在一个函数中完成许多事情。据我了解,您需要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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句