布尔值流,是真的吗?

我想并行化以下使用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))

答案 1

Streams API 实际上为您的需求提供了一流的支持:

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

与 使用 的方法相反,这可以保证具有短路评估,并最佳地利用并行性。reduce


答案 2

否,减少不支持短路评估。原因是只是接收任意实现,并且不知道短路特定操作的可能性。reduceBinaryOperator

但是,您可以更简单地执行整个操作:

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

这只会搜索一个任意项目,一旦一个线程遇到匹配项,就会返回并允许结束操作。可以查询结果是否为空,因为您对特定的匹配不感兴趣。evaltruefindAnyOptionalElement

或者,您可以按照Marko Topolnik的评论建议使用:

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

推荐