• ベストアンサー

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

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

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

  • ベストアンサー
  • HNEX
  • ベストアンサー率62% (43/69)
回答No.1

なるほどこれは、パラレルストリームで影響が出るもののようですね 実行時間差ではなく結果に影響が出ますね 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ですごく詳しく説明しているので、是非ご確認ください

参考URL:
https://qiita.com/frost_star/items/a36e66dff419e7c07151

関連するQ&A