2014-10-10 1 views
36
나는 다음과 같은 코드를 병렬화 할

parallelStream 사용 냈다 :부울 값의 스트림은 true입니까?

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는 실제로 당신의 요구 사항에 대한 일류 지원합니다 : 마르코 Topolnik의 의견에 의해 제안

은 다른 방법을 사용할 수 있습니다 단락 회로 평가 및 병렬 처리를 최적으로 활용할 수 있습니다.

12

아니요, 감소는 단락 회로 평가를 지원하지 않습니다. 그 이유는 reduce이 임의의 BinaryOperator 구현을 수신하고 특정 동작을 단락시킬 가능성에 대해 전혀 모르기 때문입니다.

하지만 당신은 훨씬 간단 전체 작업을 수행 할 수 있습니다

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

이 단순히 eval 반환 truefindAny 즉시 하나 개의 스레드가 일치가 발생했습니다으로 작업을 종료 할 수있는 임의의 항목을 검색합니다. 그 결과 Optional은 특정 일치 항목 Element에 관심이 없으므로 공백으로 쿼리 할 수 ​​있습니다. ,

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

reduce으로 접근 반대로이 :

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