1. Collecter des éléments
Enfin, nous avons atteint la méthode la plus intéressante de la Stream
classe, 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 collector
objet 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 collector
type 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 Collectors
classe seront suffisants.
Classe de collectionneurs
La Collectors
classe 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.
|
Un objet qui convertit un flux en liste ( List<T> ) |
|
Un objet qui convertit un flux en un ensemble ( Set<T> ) |
|
Un objet qui convertit un flux en map( Map<K, V> ) |
|
Concatène les éléments d'un flux en une seule chaîne |
|
Convertit les éléments d'une chaîne en unMap<K, V> |
|
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==3
chaî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 String
et 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(", ") );