加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java 8流中避免NoSuchElementException

发布时间:2020-12-15 04:42:50 所属栏目:Java 来源:网络整理
导读:这个问题是早期问题的后续问题: Adding up BigDecimals using Streams 问题与使用Java 8 Streams和Lambda表达式添加BigDecimals有关.在实现给出的答案后,我遇到了另一个问题:每当流为空时,Optional :: get()方法都会抛出NoSuchElementException. 请考虑以
这个问题是早期问题的后续问题: Adding up BigDecimals using Streams

问题与使用Java 8 Streams和Lambda表达式添加BigDecimals有关.在实现给出的答案后,我遇到了另一个问题:每当流为空时,Optional :: get()方法都会抛出NoSuchElementException.

请考虑以下代码:

public static void main(String[] args){
    LinkedList<BigDecimal> values = new LinkedList<>();
//        values.add(BigDecimal.valueOf(.1));
//        values.add(BigDecimal.valueOf(1.1));
//        values.add(BigDecimal.valueOf(2.1));
//        values.add(BigDecimal.valueOf(.1));

    // Classical Java approach
    BigDecimal sum = BigDecimal.ZERO;
    for(BigDecimal value : values) {
        System.out.println(value);
        sum = sum.add(value);
    }
    System.out.println("Sum = " + sum);

    // Java 8 approach
    values.forEach((value) -> System.out.println(value));
    System.out.println("Sum = " + values.stream().reduce((x,y) -> x.add(y)).get());
}

vanilla Java代码对空集合没有问题,但新的Java 8代码可以.

在这里避免使用NSEE最优雅的方法是什么?当然我们可以这样做:

System.out.println("Sum = " + values == null || values.isEmpty() ? 0 : values.stream().reduce((x,y) -> x.add(y)).get());

但是有没有一种Java-8-ish方式来处理空集合?

解决方法

在这种情况下,您应该不使用可以返回Optional< BigDecimal>的reduce版本.

您应该使用另一个版本,如前所述,在流为空的情况下提供标识元素,这就是identity元素存在的全部原因.

所以你想拥有:

System.out.println("Sum = " + values.stream().reduce(BigDecimal.ZERO,(x,y) -> x.add(y));

而不是旧版本.

在这种情况下,您不关心流是否为空,您只需要一个有效的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读