Sera un flux Java 8.forEach(x - > {}; faire quelque chose?


Je contrôle le consommateur qui accède à ce forEach afin qu'il puisse ou non être invité à effectuer une action.

list.parallelStream().forEach( x-> {} );

Les flux étant des flux paresseux ne vont pas itérer, non? Rien ne se passera est ce que je m'attends. Dites-moi si je me trompe, s'il vous plaît.

Author: lrn2prgrm, 2015-08-02

1 answers

Il parcourra tout le flux, soumettant des tâches au pool de jointures, divisant la liste en parties et transmettant tous les éléments de la liste à ce lambda vide. Actuellement, il est impossible de vérifier lors de l'exécution si l'expression lambda est vide ou non, elle ne peut donc pas être optimisée.

Problème Similaire apparaît dans l'utilisation de Collector. Tous les collecteurs ont l'opération finisher, mais dans de nombreux cas, c'est une fonction d'identité comme x -> x. Dans ce cas parfois le code qui utilise des collecteurs peut être grandement optimisé, mais vous ne pouvez pas détecter de manière robuste si le lambda fourni est une identité ou non. Pour résoudre ce problème une caractéristique de collecteur supplémentaire appelée IDENTITY_FINISH a été introduit à la place. S'il était possible de détecter de manière robuste si le lambda fourni est une fonction d'identité, cette caractéristique serait inutile.

Regardez aussiJDK-8067971 discussion. Ce propose de créer des constantes statiques comme Predicate.TRUE (toujours vrai) ou Predicate.FALSE (toujours faux) pour optimiser les opérations comme Stream.filter. Par exemple, si Predicate.TRUE est fourni, l'étape de filtrage peut être supprimée, et si Predicate.FALSE est fourni, le flux peut être remplacé par un flux vide à ce stade. Encore une fois s'il était possible de détecter lors de l'exécution que le prédicat fourni est toujours vrai, il serait inutile de créer de telles constantes.

 6
Author: Tagir Valeev, 2015-08-02 05:52:13