CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第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()メソッドを呼べないから