解決済み

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

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

お礼率 4% (35/799)

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

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

  • 回答No.1

ベストアンサー率 62% (43/69)

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

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ですごく詳しく説明しているので、是非ご確認ください
Be MORE 7・12 OK-チップでイイコトはじまる
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ