web-dev-qa-db-fra.com

Flux de valeurs booléennes, est-ce vrai?

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))
46
S1lentSt0rm

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.

98
Marko Topolnik

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))
18
Holger