gpt4 book ai didi

java - 使用 lambda 表达式对值集合执行算术运算时避免抛出 java.lang.NullPointerException

转载 作者:搜寻专家 更新时间:2023-11-01 02:40:03 24 4
gpt4 key购买 nike

给定要汇总的值列表。

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,因为它是一个可选字段。如果其中一项在类型为 weight 字段中包含一个 null 值,这将因此抛出一个 java.lang.NullPointerException java.math.BigDecmial.

当给定集合中的项目包含 null 值时,避免抛出 java.lang.NullPointerException 的最简洁方法是什么,而不是强加一个讨厌的条件像下面这样检查?

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);

最佳答案

我认为问题更多在于 reduce。你试图在一个函数中做很多事情。据我了解,您需要每个购物车的 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);

关于java - 使用 lambda 表达式对值集合执行算术运算时避免抛出 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35806615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com