這個問題是後續前面一個問題:Adding up BigDecimals using Streams在Java中8避免NoSuchElementException異常流
相關加起來使用Java 8 Stream
S和Lambda表達式BigDecimal
S上的問題。在實現給出的答案後,我遇到了另一個問題:每當流爲空時,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-ish方法來處理空集合?
逆序:values.stream()。reduce((x,y) - > x.add(y))。ifPresent(s - > System.out.println(「sum =」+ s)); //只有在有價值時纔打印總和。 –