11

Stream新しい JDK8クラスに次のreduceメソッドしか含まれていないのはなぜですか。

T reduce(BinaryOperator<T> reducer)
T reduce(T identity, BinaryOperator<T> reducer)
U reduce(U identity, BiFunction<U, ? super T, U> reducer, 
    BinaryOperator<U> combiner)

しかし、他の言語 (Haskell など) に見られるreduce/関数に対応する明白なメソッドではなく、次のようになります。foldfoldl :: (a -> b -> a) -> a -> [b] -> a

U reduce(U identity, BiFunction<U, ? super T, U> reducer)

?

combiner代わりに、追加の引数を持つ同様のメソッドがあります。上記でリンクした API ドキュメントでは、例でこの引数を使用していないため、使用方法もわかりません。必要なプロパティについてのみ言及しています。

foldJDK8 メソッドがこのように作成されるのはなぜですか? また、標準の動作をエミュレートするにはどうすればよいですか?

4

1 に答える 1

11

reduceようなデータ並列操作は、データセット (要素の配列など) に対する一般的な値の集計操作として機能します。これらを使用して、合計などを実装できます。

データセットの値が組み合わされる順序 (合計など) は指定されていないためfoldl、Haskell の found またはScala のreduceLeft/ found に対応していません。foldLeft

3 行目の追加のcombiner引数は、集計の結果の型が要素の型と異なる場合に使用されます。このような場合、2 つの結果を組み合わせる方法を指定する必要があります。3 番目の reduce を使用して、文字列内の母音の数を実装したいとしましょう。データ要素は文字であり、reducer文字と現在のカウントを組み合わせる方法を指定します。

(Integer count, Character c) -> if (isVowel(c)) count + 1 else count

コンバイナーは単なる合計になります。

(Integer count1, Integer count2) -> count1 + count2

たとえば、Scala Parallel Collectionsには、しばらくの間これらがあります( を検索してくださいaggregate)。

于 2013-04-03T12:16:37.360 に答える