-PR-
解決済み

Stream#reduceの第3引数について

  • すぐに回答を!
  • 質問No.9385326
  • 閲覧数163
  • ありがとう数0
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 4% (33/697)

Stream#reduce
Stream#collect
の第3引数「combiner」が何のためにあるのか分かりません。パラレルストリームで第3引数を入れても入れなくても実行時間に差はありませんでした。Javaの参考書には「部分的な途中の集約結果を用いて、第3引数で指定された処理を行います」と書いてありますが、サンプルコードでは「combiner」を入れても入れなくても処理結果が変わらないので「combiner」を有効活用する例が分かりません。ネットで検索しても分かりませんでした。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル9

ベストアンサー率 62% (42/67)

なるほどこれは、パラレルストリームで影響が出るもののようですね
実行時間差ではなく結果に影響が出ますね

1~6までを単純に足し込む式を下記のように作りましたがcombinerの有無で結果が違いました
有り:21 正解
無し:45 不正解

public void test() {
List<Integer> list = Arrays.asList(1,2,3,4,5);
int identity = 6;
System.out.println(list.stream().parallel().reduce(identity, (x, y) -> x + y, (x, y) -> x + y - identity));
System.out.println(list.stream().parallel().reduce(identity, (x, y) -> x + y));
}

combinerの式が「x + y - identity」となっているのはjavadocにある
「すべてのuについて、combiner(identity, u)がuに等しくなります」
「combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)」
を成立させるためです

参考URLですごく詳しく説明しているので、是非ご確認ください
このQ&Aで解決しましたか?
関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

ページ先頭へ