第2章 ストリーム API の使い方 : 問題 10 : reduce メソッドで平均の計算
問題 10
Stream<Double>
の平均を計算するために利用できるreduce
の呼び出しを書け
解答
Stream<Double> stream = Stream.of(1.0, 2.0, 3.0, 4.0);
とします。
本来はreduce
メソッドを使わないで
stream.collect(Collectors.averagingDouble(Double::doubleValue));
とするのが普通です。
reduce
メソッドは、骨の折れるパズルですね。
stream.reduce( new double[3], (r, e) -> { r[0] += e.doubleValue(); r[1] += 1.0; r[2] = r[0] / r[1]; return r; }, (r, s) -> { r[0] += s[0]; r[1] += s[1]; r[2] = r[0] / r[1]; return r; } )[2];
さらに問題
単純に合計を計算してcount()
で割る方法がとれないのはなぜか?
解答
合計の計算は終端操作なので、その後でcount()
メソッドを呼べないから