2014-10-10 56 views
36

我想并行下面的代码使用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)) 

回答

76

流API实际上有您的要求提供一流的支持:

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

至于反对你的做法与reduce,这保证有短路评估和最佳平衡。

12

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

但是你可以完成整个操作更简单:

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

这只是搜索任意一项针对eval回报truefindAny允许只要一个线程遇到比赛结束操作。由于您对特定匹配Element不感兴趣,因此可能会查询生成的Optional为空。

或者您可以使用马尔科Topolnik的评论的建议:

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