web-dev-qa-db-ja.com

ブール値のストリーム、本当ですか?

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))
46
S1lentSt0rm

Streams APIは、実際にお客様の要件を一流でサポートしています。

setOfE.parallelStream().anyMatch(e->eval(e));

reduceを使用したアプローチとは対照的に、これにより短絡評価が行われ、並列処理が最適に活用されることが保証されます。

98
Marko Topolnik

いいえ、削減は短絡評価をサポートしていません。理由は、reduceは任意のBinaryOperator実装を受け取るだけであり、特定の操作を短絡する可能性についてはまったくわからないからです。

ただし、操作全体をはるかに簡単に実行できます。

setOfE.parallelStream().filter(e -> eval(e)).findAny().isPresent()

これは、単にevaltrueを返す任意のアイテムを検索し、findAnyは1つのスレッドが一致を検出するとすぐに操作を終了できるようにします。特定の一致するOptionalに興味がないので、結果のElementは空であるかどうかを照会できます。

または、Marko Topolnikのコメントで提案されているように使用できます。

setOfE.parallelStream().anyMatch(e -> eval(e))
18
Holger