当前位置: 首页 > 知识库问答 >
问题:

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

孙岳
2023-03-14

给出了一个要总结的值列表。

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

这里,购物车。getProduct()。getWeight()在任何时候都可能是null,因为它是可选字段。因此,这将抛出一个java。lang.NullPointerException,如果其中一项在java类型的weight字段中包含null值。数学大数据项

避免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.NullPointerExcue,因为给定列表中包含一个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);

共有3个答案

宿楚青
2023-03-14

你可以这样做:

Integer sum = list.stream().filter(Objects::nonNull).reduce(0, Integer::sum);

拜拜!

史鸿运
2023-03-14

这里有几个解决这个问题的方法。

        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);
祁飞扬
2023-03-14

我认为问题更多的是减少。你试着在一个函数中做很多事情。据我所知,您需要每个购物车的重量*数量之和。我会这样做:

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

 类似资料:
  • 给定一棵仅由加减法运算符、数字组成的二进制算术表达式树,如何使树尽可能平衡?任务是在不求表达式值的情况下平衡树,即节点数应该保持不变。 示例: 加法是可交换的和相联的,这允许平衡。交换性允许交换连续“+”节点的子节点。关联性允许旋转。在上述示例中,所执行的转换可以被视为 null 另一种方法可以是将表达式树读入数组,并用变量替换任何'-'子树。然后使用DP确定括号的最佳位置。这必须是自下而上的,这

  • 我在骆驼路线中使用了这个表达: 然而,它对这个符号感到震惊。 如何构造这个表达式,假定它从消息体上POJO的getter获取一个值,并将其压缩到Exchange上的一个属性(加1)。

  • 问题内容: 我一直在阅读有关Go中的常量的文章,并且试图了解它们如何在内存中存储和使用。您可以在Go中对非常大的常量执行运算,并且只要结果适合内存,就可以将结果强制为类型。例如,如您所料,此代码显示: 这是如何工作的?在某个时候,Go必须存储并存储在内存中,以便对其执行操作。那么常量是如何存储的,Go如何对其进行算术运算呢? 问题答案: 简短摘要(TL; DR)在答案的结尾。 无类型的任意精度常量

  • 我想执行基本的算术运算,如加法,减法,乘法和除法,每个操作仅使用一个通用方法,用于包装类型,如,,...(不包括和)。 我尝试使用泛型类做如下(用于添加)。 它会发出编译时错误, 运算符不能应用于E,E 有没有办法使用这种通用版本来实现这种操作?

  • 了解ANTLR最好的方法就是实例。构建一个简单的计算器是个不错的主意。为了使它容易理解且保持简单,我们将只允许基本的算术运算符(加、减、乘、除)、括号表达式、整数和变量。 grammar Calc; prog : stat+ ; stat : expr | ID '=' expr ; expr : expr ('*'|'/') expr

  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示