コンバイナなしの並列ストリームの削減は、複数のスレッドによって正しく実行されます。この場合、いつコンバイナーを使用する必要がありますか?

gstackoverflow

私は以下について読んだ:

https://stackoverflow.com/a/22814174/2674303

そして、正しいマージアキュムレータの結果を得るために、コンバイナがパラレルストリームでのみ使用する解決策を作成しました。各スレッドに1つのアキュムレータインスタンス。

したがって、コンバイナーなしで縮小する解像度は正しく機能しないようにしました。

これを確認するために、次の例を作成しました。

   Person reduce = Person.getPersons().stream()
                .parallel() 
                .reduce(new Person(), (intermediateResult, p2) -> {
                    System.out.println(Thread.currentThread().getName());
                    return new Person("default", intermediateResult.getAge() + p2.getAge());
                });
        System.out.println(reduce);

モデル:

public class Person {

    String name;

    Integer age;
    ///...

    public static Collection<Person> getPersons() {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Vasya", 12));
        persons.add(new Person("Petya", 32));
        persons.add(new Person("Serj", 10));
        persons.add(new Person("Onotole", 18));
        return persons;
   }
}

ご覧のとおり、コンバイナーの
サンプル出力は提供していません

ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-1
Person{name='default', age=72}

アプリケーションを数回実行しましたが、常に正しい結果が表示されます。

コンバイナが提供されていない場合、並列ストリームの動作を減らす方法を説明してください。

タギル・ヴァレエフ

この場合、アキュムレータはコンバイナとしても機能します。これは、リダクションタイプがストリーム要素タイプと同じ場合の省略形です。したがって、

myStream.reduce(identity, accumulator);

と完全に同等です

myStream.reduce(identity, accumulator, accumulator);

OpenJDKでこれらのメソッドのソースコードを確認することもできます

@Override
public final <R> R reduce(R identity, BiFunction<R, ? super P_OUT, R> accumulator, 
                          BinaryOperator<R> combiner) {
    return evaluate(ReduceOps.makeRef(identity, accumulator, combiner));
}

@Override
public final P_OUT reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator) {
    return evaluate(ReduceOps.makeRef(identity, accumulator, accumulator));
}

3つの引数のバージョンは、縮小操作によって別のタイプのオブジェクトが生成される可能性があるため、より柔軟性があります。この場合、結果の型の2つの要素を組み合わせる方法のルールを提供しないため、2つの引数の削減を使用することはできません。ただし、結果のタイプが同じである場合、アキュムレータとコンバイナは同じオブジェクトタイプで機能するため、関連付けられている場合は、まったく同じ操作である必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ