避免在使用 lambda 表达式对一组值执行算术运算时抛出 java.lang.NullPointerException

Tin*_*iny 5 java lambda nullpointerexception java-8

给定要总结的值列表。

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);
Run Code Online (Sandbox Code Playgroud)

在这里,cart.getProduct().getWeight()可以null在任何时候,因为它是一个可选字段。因此java.lang.NullPointerException,如果其中一项nullweighttype 字段中包含值,则会抛出 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);
Run Code Online (Sandbox Code Playgroud)

同样,以下也将抛出 a 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);
Run Code Online (Sandbox Code Playgroud)

njz*_*zk2 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);
Run Code Online (Sandbox Code Playgroud)