布尔值流,是真的吗?

新手上路,请多包涵

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

原文由 S1lentSt0rm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 402
2 个回答

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

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

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

原文由 Marko Topolnik 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

这只是搜索一个任意项目 eval 返回 truefindAny 允许在遇到匹配时立即结束操作。结果 Optional 可以查询是否为空,因为您对特定匹配不感兴趣 Element

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

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

原文由 Holger 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题