Javaストリームでいくつかの作業を並列化しようとしています。のは、この単純な例を考えてみましょう:私はforEach
を使用する場合Javaストリームジェネレータが順序付けられていないのはなぜですか?
Stream.generate(new Supplier<Integer>() {
@Override
public Integer get() {
return generateNewInteger();
}
})
.parallel()
.forEachOrdered(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
問題は、それがforEachOrdered
ためaccept
メソッドを呼び出していないということです、それだけで動作します。問題はStream.generate
が内部でORDERED
の特性を持たないInfiniteSupplyingSpliterator
を作成しているということです。
質問はなぜですか?どのような順序でデータが生成されるかはわかっているようです。 2番目の質問は、ストリーム要素の生成で並列化されたストリームでforEachOrdered
を実行する方法です。
仕様はそう言います。それが完了しない理由は、実装の詳細と組み合わせた*無限*です。 – Holger
これは、ラムダではるかに簡潔に書くことができます。 –
関連していませんが、 '.forEachOrdered(System.out :: println)' –