【发布时间】:2014-05-03 18:58:29
【问题描述】:
这个问题是对先前问题的后续问题: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());
}
原版 Java 代码对空集合没有问题,但新的 Java 8 代码可以。
在这里避免 NSEE 的最优雅的方法是什么?我们当然可以:
System.out.println("Sum = " + values == null || values.isEmpty() ? 0 : values.stream().reduce((x, y) -> x.add(y)).get());
但是有没有一种 Java-8 的方式来处理空集合?
【问题讨论】:
-
颠倒顺序:values.stream().reduce((x, y) -> x.add(y)).ifPresent(s -> System.out.println("sum = " + s)); // 只有当它有值时才打印总和。
标签: java lambda java-8 java-stream