gpt4 book ai didi

java - 避免 Java 8 流中的 NoSuchElementException

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:10 27 4
gpt4 key购买 nike

此问题是先前问题的后续问题:Adding up BigDecimals using Streams

与使用 Java 8 Stream 和 Lambda 表达式相加 BigDecimal 相关的问题。在实现给出的答案后,我遇到了另一个问题:每当流为空时,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());
}

原始 Java 代码没有空集合问题,但新的 Java 8 代码有。

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

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

但是是否有类似 Java-8 的方法来处理空集合?

最佳答案

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

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

所以你想要:

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

代替旧版本。

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

关于java - 避免 Java 8 流中的 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642961/

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