这个问题是之前一个问题的后续: 使用流(Streams)将BigDecimals相加
该问题涉及使用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(NullPointerException)?当然,我们可以这样做:
System.out.println("Sum = " + values == null || values.isEmpty() ? 0 : values.stream().reduce((x, y) -> x.add(y)).get());
但是有没有一种Java 8的方式来处理空集合呢?