1. Collecter des éléments

Enfin, nous avons atteint la méthode la plus intéressante de la Streamclasse, la collect()méthode. Il est utilisé pour passer des flux à nos collections familières — List<T>, Set<T>et Map<T, R>autres.

La collect()méthode prend un collectorobjet spécial comme argument. Cet objet lit toutes les données du flux, les convertit en un type spécifique de collection et les renvoie. Et puis la méthode collect elle-même renvoie cette collection.

Tout cela est fait d'une manière plutôt astucieuse : le collectortype de l'objet est Collector<T, A, R>. Comme vous pouvez le voir, il a trois paramètres de type. Le dernier paramètre de type ( R) est généralement un type comme List<T>. Cela signifie que le compilateur peut utiliser ce type pour déterminer le type de retour correct pour la collect()méthode elle-même.

J'espère que vous n'êtes pas trop confus. Dans tous les cas, vous n'avez pas besoin de créer vous-même des objets Collector. Les objets prêts à l'emploi renvoyés par les méthodes statiques de la Collectorsclasse seront suffisants.

Classe de collectionneurs

La Collectorsclasse a plusieurs méthodes statiques qui renvoient des objets collecteurs prêts à l'emploi — quelque chose pour chaque occasion. Ici, nous allons considérer les plus importants.

toList()
Un objet qui convertit un flux en liste ( List<T>)
toSet()
Un objet qui convertit un flux en un ensemble ( Set<T>)
toMap()
Un objet qui convertit un flux en map( Map<K, V>)
joining()
Concatène les éléments d'un flux en une seule chaîne
mapping()
Convertit les éléments d'une chaîne en unMap<K, V>
groupingBy()
Regroupe les éléments et renvoieMap<K, V>

2. Conversion d'un flux en liste

Voici un exemple typique d'utilisation d'un flux et de conversion du résultat en liste

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

List<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toList() );

Nous avons reçu un flux de la collection. Ensuite, nous avons obtenu un nouveau flux en ne conservant que les chaînes dont le premier caractère est en majuscule. Ensuite, toutes les données de ce flux sont collectées dans une collection, qui est ensuite renvoyée.



3. Convertir un stream en set

Voici un exemple typique de travail avec un flux et de conversion du résultat en un ensemble

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Set<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toSet() );

Tout est très similaire au code de conversion d'un flux en un List, sauf que nous utilisons un objet collecteur différent, qui est renvoyé par la toSet()méthode.



4. Conversion d'un flux en carte

Mais convertir un flux en carte est un peu plus difficile. Chaque entrée d'une carte se compose de deux éléments : une clé et une valeur. Nous devons déterminer comment définir la clé et la valeur de chaque élément du flux.

Exemple:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");

Map<String, String> result = list.stream()
   .map( e -> e.split("=") )
   .filter( e -> e.length == 2 )
   .collect( Collectors.toMap(e -> e[0], e -> e[1]) );

Jetons un coup d'œil à ce qui se passe ici.

Dans la première ligne, nous utilisons map(...)pour convertir chaque chaîne en un tableau de chaînes. En utilisant la méthode split, nous divisons chaque chaîne en deux parties.

Dans la deuxième ligne, nous ne transmettons à la filter()méthode que les tableaux contenant exactement deux éléments. La d==3chaîne est divisée en un tableau de trois éléments, qui ne correspond pas au filtre.

Et enfin, dans la dernière ligne, nous convertissons le flux en un fichier Map<String, String>. Deux fonctions sont passées à la toMap()méthode. Pour chaque élément du flux, la première fonction doit renvoyer la clé et la seconde la valeur .

Le premier élément de chaque tableau ("a", "b", "c") sera notre clé, et le deuxième élément de chaque tableau ("2", "3", "4") sera notre valeur.



5. Conversion d'un flux en chaîne

Un autre objet de collection intéressant est retourné par Collectors.joining(). Il convertit tous les éléments d'un flux Stringet les concatène en une seule chaîne. Exemple

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );