CUBは子供の白熊

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

第3章 ラムダ式を使ったプログラミング : 問題 19 : Stream の reduce メソッド

問題

Stream<T>reduceメソッドは、以下のように宣言している

<U> U reduce(U identify, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)

accumulatorの型を

BiFunction<? super U, ? super T, U> accumulator

と宣言すべきか?

解答

No ! である

Stream<T>reduceメソッドJava Doc にあるように、accumulatorは以下のように使われる

Stream<T>reduceメソッドの実装イメージ

U result = identify;
for (T element : stream) {
    result = accumulator.apply(result, element);
}
return result;

これを見るとaccumulatorapplyメソッドの第一引数の型は常に U で、U の親クラスになることはないのだ

数学的帰納法だと

  1. resultの最初の値はidentifyなので、型は U
  2. その後のresultapplyメソッドの戻り値なので、型は U
  3. つまり、どこまで行ってもresultの型は U

というふうに証明できる :-)