3

この質問は、以前の質問へのフォローアップです: Streams を使用して BigDecimals を追加する

BigDecimalJava 8 Streams と 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 風の方法はありますか?

4

2 に答える 2

5

質問をするために例を入力しているときに、答えを見つけました:

Stream::reduce()Optionalメソッドを持つ を返します: orElse()。そう、

System.out.println("Sum = " + values.stream().reduce((x, y) -> x.add(y)).get());

になる

System.out.println("Sum = " + values.stream().reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO));

ということで、Q&Aを投稿することにしました。

ラムダは素晴らしいです。+1 ジャワ。

于 2014-03-25T18:12:40.613 に答える