Java 8 Streams peek api

J’ai essayé l’extrait suivant de code Java 8 avec peek .

 List list = Arrays.asList("Bender", "Fry", "Leela"); list.stream().peek(System.out::println); 

Cependant, rien n’est imprimé sur la console. Si je le fais à la place:

 list.stream().peek(System.out::println).forEach(System.out::println); 

Je vois ce qui suit qui produit à la fois le coup d’oeil et l’invocation foreach.

 Bender Bender Fry Fry Leela Leela 

Les deux foreach et peek prennent une action (Consumer action) Alors pourquoi la sortie est-elle différente?

La Javadoc mentionne ce qui suit:

Les opérations intermédiaires renvoient un nouveau stream. Ils sont toujours paresseux; L’exécution d’une opération intermédiaire telle que filter () n’effectue aucun filtrage, mais crée un nouveau stream qui, une fois traversé, contient les éléments du stream initial correspondant au prédicat donné. La traversée de la source du pipeline ne commence pas tant que le fonctionnement terminal du pipeline n’est pas exécuté.

peek étant une opération intermédiaire ne fait rien. En appliquant une opération de terminal telle que foreach , les résultats sont imprimés tels quels.

La documentation pour peek dit

Renvoie un stream composé des éléments de ce stream, en effectuant en outre l’action fournie sur chaque élément au fur et à mesure que les éléments sont consommés à partir du stream résultant. Ceci est une opération intermédiaire.

Vous devez donc faire quelque chose avec le stream résultant pour System.out.println pour faire quelque chose.

Dans la documentation sur Stream pour la méthode Peek:

… effectuant en outre l’action fournie sur chaque élément à mesure que les éléments sont consommés à partir du stream résultant.

En Java-8, les stream sont paresseux. De plus, s’il existe deux opérations enchaînées dans le stream, la seconde opération commence dès que la première a fini de traiter une unité d’élément de données (étant donné qu’il existe une opération de terminal dans le stream).

C’est la raison pour laquelle vous pouvez voir des chaînes de noms répétés en cours de sortie.