Je souhaite paralléliser l'extrait de code suivant à l'aide d'un flux parallèle:
boolean anyTrue() {
for (Element e : setOfE) {
if (eval(e)) {
return true;
}
}
return false;
}
Les méthodes suivantes fonctionnent-elles sur des flux parallèles et utilisent-elles une évaluation régulière des courts-circuits?
setOfE.parallelStream().map(e -> eval(e)).reduce(false, (a,b) -> a || b))
L’API Streams offre un support de premier ordre pour votre besoin:
setOfE.parallelStream().anyMatch(e->eval(e));
Contrairement à votre approche avec reduce
, il est garanti que vous aurez une évaluation de court-circuit et que vous optimiserez le parallélisme.
Non, la réduction ne prend pas en charge l'évaluation des courts-circuits. La raison en est que reduce
ne reçoit qu'une implémentation arbitraire de BinaryOperator
et n'a aucune idée des possibilités de court-circuiter l'opération en question.
Mais vous pouvez effectuer toute l'opération de manière beaucoup plus simple:
setOfE.parallelStream().filter(e -> eval(e)).findAny().isPresent()
Ceci recherche simplement un élément arbitraire pour lequel eval
renvoie true
et findAny
permet de terminer l'opération dès qu'un thread a rencontré une correspondance. Il est possible de demander à Optional
qui en résulte d'être vide car vous n'êtes pas intéressé par la correspondance particulière Element
.
Sinon, vous pouvez utiliser comme suggéré par le commentaire de Marko Topolnik:
setOfE.parallelStream().anyMatch(e -> eval(e))