2016-12-08 8 views
4

Stream::reduceメソッドのaccumulator引数がBiFunctionで、combiner引数のようにBinaryOperatorではないのはなぜですか?アキュムレータはなぜStream :: :: BiFunctionを減らし、コンバイナのようなBinaryOperatorを減らさないのですか?

なぜタイプがBiFunction<U, ? super T, U>ですか?なぜTですか? BiFunction<U, ? extends U, U>でなければなりませんか?

+2

質問は完全には明らかではありませんが、http://stackoverflow.com/questions/35680706/what-are-good-reasons-for-choosing-invariance-in-an-api- (それはむしろ「逆の」質問であるように思われるが...) – Marco13

答えて

6
<U> U reduce(U identity, 
      BiFunction<U, ? super T, U> accumulator, 
      BinaryOperator<U> combiner); 

アキュムレータは(タイプTで示されている)(タイプUによって示される)reduce演算の中間結果にStreamの要素を追加し、更新された結果を返す関数です。 (タイプUも)。

したがって、オペランドと結果がすべて同じタイプのBinaryOperatorと定義することはできません。

たとえば、reduceコールStream<String>に適用され、すべての要素の長さの和を発生するBiFunction<Integer,String,Integer>アキュムレータとして渡すことがあります。そのためにBinaryOperator<Integer>またはBinaryOperator<String>を使用することはできません。

一方、コンバイナは、二つの中間結果(同じタイプUの両方)を取り、その種類もUある結果にそれらをマージします。したがって、(これはBiFunction<U,U,U>まで拡張されます)を使用することができます。

+0

U reduce(U identity、 BiFunction アキュムレータ、 BinaryOperator ) 、私は、アキュムレータがBiFunctionであり、シグネチャが存在するはずのこのバージョンのメソッドについて質問していますか?スーパーU. https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html –

+2

@AhmadMoawadこれは私の答えで言及していたのと同じ方法の署名です。 – Eran

関連する問題