この質問は、以前の質問へのフォローアップです: Streams を使用して BigDecimals を追加する
BigDecimal
Java 8 Stream
s と Lambda 式を使用して 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 風の方法はありますか?