2014-10-10 28 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))