这个问题是对较早问题的后续问题:使用 Streams 添加 BigDecimals
BigDecimal
与使用 Java 8Stream
和 Lambda 表达式加起来有关的问题。在实现给出的答案后,我遇到了另一个问题:只要流为空,该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 的方式来处理空集合?