2014-10-10 3 views
36

ich den folgenden Code parallelisieren wollen snipped eine parallelStream mit:Stream von booleschen Werten, ist wahr?

boolean anyTrue() { 
    for (Element e : setOfE) { 
    if (eval(e)) { 
     return true; 
    } 
    } 
    return false; 
} 

Wird die folgenden Arbeiten an parallelen Strömen und verwenden regelmäßige Evaluierung Kurzschluss?

setOfE.parallelStream().map(e -> eval(e)).reduce(false, (a,b) -> a || b)) 

Antwort

76

Streams API tatsächlich verfügt über erstklassige Unterstützung für Ihre Anforderung:

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

Wie bei reduce zu Ihrem Ansatz gegenüber, diese garantiert eine Kurzschlussauswertung und optimale Parallelität.

12

Nein, die Reduzierung unterstützt keine Kurzschlussauswertung. Der Grund ist, dass reduce nur eine beliebige BinaryOperator Implementierung empfängt und keine Ahnung von den Möglichkeiten des Kurzschlusses der jeweiligen Operation hat.

Aber man kann den gesamten Betrieb durchführen viel einfacher:

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

Dieses einfach sucht nach einer beliebigen Position, für die eval kehrt true und findAny ermöglicht den Vorgang zu beenden, sobald ein Thread eine Übereinstimmung aufgetreten ist. Die resultierende Optional kann als leer abgefragt werden, da Sie nicht an der jeweiligen passenden Element interessiert sind.

Alternativ können Sie wie von Marko Topolnik Kommentar vorgeschlagen verwenden:

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