Java 8 : Les nouveautés

Découvrir les opérations collect, flatMap et reduce

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Les opérations collect, flatMap et reduce permettent de récupérer un conteneur, de traiter un flux pour chaque élément, ou de réduire un flux à une seule valeur.

Transcription

Dans cette vidéo j'aimerais que l'on aborde les opérations collect, flat map et reduce sur le Stream. Alors pour ça je vais avoir besoin d'une classe qui, comme d'habitude va s'appeler personne, qui va donc être peut-être un peu plus élaborée que d'habitude; en l'occurrence j'aurai droit à un âge et à un deuxième attribut qui sera son nom. Cette personne va être équipée d'un constructeur prenant en paramètre donc le nom en question et l'âge en question, avec un code donc, pour le coup assez classique. Nom=this.nom =nom; this.age=age. Je vais rajouter un getter pour l'âge, avec un code totalement classique. Et pour le nom, pareil un getter qui va être donc le retour du nom de la personne. Voilà donc un code assez classique pour une personne. Rien de bien original. Et ici donc je vais Donc ici je vais dans un premier temps me créer une liste de personnes, donc liste = new ArrayList de personnes, bien sûr, que je vais alimenter par Liste.add New personne. Fabien, 47. Puis je vais me faire un petit ajout de Xavier, on va dire, 34. Liste.add new personne de Dimitri , 23. Voilà donc là j'ai simplement à rajouter évidemment les imports qui vont bien pour les Java util quelque chose. Donc il me suffira de faire un import de étoile pour que ce code donc passe sans problème. Donc maintenant je vais illustrer le collect de la façon suivante : liste.Stream, donc je vais récupérer le flux sur la liste. Alors qu'est-ce que je vais récupérer? Déjà mettons-nous d'accord, je vais récupérer une liste personne, mais qui sera filtrée. Liste Filtrée. Liste.Stream. Alors qu'est-ce que je vais aller chercher sur ce flux? Eh bien : filter. Je vais filtrer uniquement les personnes dont l'âge "est supérieur à"; donc ici uniquement pour la personne p.getAge est supérieur à on va dire à 30. Donc je ne vais prendre que les personnes dont l'âge est supérieur à 30. Et je fais ici un collect. Donc là je vais essayer de récupérer une liste de mon flux. Donc quelque chose qui est a priori pas très compliqué. Il suffirait que je parcoure la liste et que je regarde l'âge pour chacun. Donc vous remarquerez que d'ailleurs pour faire l'affichage, j' allais faire un ForEach classique mais effectivement je pourrais faire un ListeFiltrée. stream.forEach. Et là je fais donc appel au système .out ::println plutôt que de faire un "for", etc... L'appliquer donc directement, forEach voilà, mieux avec un grand E, alors pas foreach en un seul mot, c'est pas une instruction. J'exécute mon code et je me retrouve effectivement à faire appel à toString sur des personnes. Alors c'est vrai que l'âge ici je ne le vois pas beaucoup, vous connaissez la solution, c'est tout simplement qu'il faut une méthode toString qui est de façon préférée, un override de toString, que l'on trouve sur la classe Object par ailleurs. Donc là, l'override est souligné tant que je n'ai pas donné le bon nom à la méthode toString. Et je retourne donc ici le nom, concaténé avec un petit effort de typo. Je ré-exécute et j'obtiens donc effectivement Fabien et Xavier qui ont un âge supérieur à 30 ici. Donc ce qu'on a ici c'est la possibilité avec collect, de récupérer une liste à partir de mon flux, tout simplement. Le collecteur pourrait être utilisé un petit peu différemment : par exemple, je vais récupérer l'âge moyen de mes personnes. Je vais le faire de la façon suivante: liste.stream.collect Et là ici, dans les collecteurs qui sont proposés, j'ai averagingInt. C'est un "double" que je vais récupérer en fait c'est un peu idiot, parce que j'ai un âge à récupérer: p.getAge. Donc je n'ai plus qu'à le faire afficher, c'est ce que je vais faire immédiatement ici: out.println de âge moyen ":" et je rajoute donc cette variable âge moyen, enfin j'ajoute, je concatène, c'est assez malheureux d'ailleurs qu'on l'utilise plus pour faire une concaténation. Un âge moyen de 34.666, je sais pas si c'est bien vrai. En l'occurrence ici on part de la liste totale. On pourrait très bien partir de la liste filtrée bien entendu. La fonction reduce fonctionnera dans la même idée. Donc, ageTotal = -alors je vais prendre ma liste de personnes- ma liste.stream, -comme d'habitude- "." là je vais aller chercher donc reduce basé à zéro. Il y a plusieurs versions de reduce. Là celle que je vais utiliser va prendre en paramètre donc une fonction qui prend une somme et une personne, et en fait ce que l'on fait avec ça, c'est que l'on va rajouter à la somme l'âge de la personne en question. Et deuxième paramètre, Somme 1, somme 2. Ce que l'on fait c'est que l'on fait s1 + s2. Donc, plus qu'une parenthèse à enlever voilà. Donc là je vais me retrouver à prendre tous les éléments que j'ai dans ma liste, obtenir un flux, ça c'est le 0 c'est la somme de départ. Je prends somme et p et ce que je fais c'est que j'ajoute donc l'âge à la somme, et ici lorsqu'on a deux sommes, je fais la somme des deux. Et donc, je vais afficher le résultat comme d'habitude. AgeTotal + -ça s'appelle ageTotal tout simplement-. Affichage de l'affaire: âge total 104 effectivement, le total de l'âge de mes personnes. Voilà, donc ça c'est une fonction reduce qui va retourner un élément en fait, à partir d'un flux d'éléments. Quant au flatMap, eh bien il fonctionnera comme la map, sauf que la map transforme un élément en un seul élément, alors que flatMap va vous retourner un flux à partir de chaque élément que vous parcourez. C'est-à-dire qu'ici par exemple, je voudrais introduire un map. Je pourrais transformer chaque élément personne en quelque chose. D'ailleurs je devrais plutôt le placer ici, par exemple: map. Ici je vais récupérer la personne p qui a un âge supérieur à 30, et je peux la transformer en son âge, je pourrais avoir un truc comme ça, p.getAge. Et bien flatMap va me permettre, non pas de récupérer l'âge d'une personne mais un certain nombre d'éléments associés à cet âge. Donc là évidemment il y a un petit problème au niveau des correspondances. Donc flatMap, comme map mais qui permet de traiter un ensemble d'objets liés à chaque objet que j'ai à l'intérieur de mon flux. On voit donc qu'on a une écriture ici qui est très simple en fait.

Java 8 : Les nouveautés

Découvrez les nouveautés introduites par la version 8 de Java. Voyez les expressions lambda, les références de méthodes, les méthodes par défaut dans les interfaces, etc.

1h44 (21 vidéos)
Aucun commentaire n´est disponible actuellement
Logiciel :
Spécial abonnés
Date de parution :17 août 2015

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !