こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

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

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

投稿日時 - 2017-10-13 09:16:03

QNo.9385326

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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

投稿日時 - 2017-10-16 18:00:57