ParallelStreamを使用して切り取った次のコードを並列化します。
boolean anyTrue() {
for (Element e : setOfE) {
if (eval(e)) {
return true;
}
}
return false;
}
以下は並列ストリームで機能し、定期的な短絡評価を使用しますか?
setOfE.parallelStream().map(e -> eval(e)).reduce(false, (a,b) -> a || b))
Streams APIは、実際にお客様の要件を一流でサポートしています。
setOfE.parallelStream().anyMatch(e->eval(e));
reduce
を使用したアプローチとは対照的に、これにより短絡評価が行われ、並列処理が最適に活用されることが保証されます。
いいえ、削減は短絡評価をサポートしていません。理由は、reduce
は任意のBinaryOperator
実装を受け取るだけであり、特定の操作を短絡する可能性についてはまったくわからないからです。
ただし、操作全体をはるかに簡単に実行できます。
setOfE.parallelStream().filter(e -> eval(e)).findAny().isPresent()
これは、単にeval
がtrue
を返す任意のアイテムを検索し、findAny
は1つのスレッドが一致を検出するとすぐに操作を終了できるようにします。特定の一致するOptional
に興味がないので、結果のElement
は空であるかどうかを照会できます。
または、Marko Topolnikのコメントで提案されているように使用できます。
setOfE.parallelStream().anyMatch(e -> eval(e))