1. Elementen verzamelen

Eindelijk zijn we aangekomen bij de meest interessante methode in de Streamklas, de collect()methode. Het wordt gebruikt om van streams naar onze vertrouwde collecties te gaan - List<T>, Set<T>, Map<T, R>en andere.

De collect()methode neemt een speciaal collectorobject als argument. Dit object leest alle gegevens uit de stream, converteert deze naar een specifiek soort verzameling en retourneert deze. En dan retourneert de collect-methode zelf deze collectie.

Dit alles gebeurt op een nogal gelikte manier: het collectorobjecttype is Collector<T, A, R>. Zoals u kunt zien, heeft het drie typeparameters. De laatste typeparameter ( R) is meestal een type zoals List<T>. Dit betekent dat de compiler dit type kan gebruiken om het juiste retourtype voor de collect()methode zelf te bepalen.

Ik hoop dat je niet te verward bent. U hoeft in ieder geval niet zelf Collector-objecten aan te maken. De kant-en-klare objecten die worden geretourneerd door de statische methoden van de Collectorsklasse zijn voldoende.

Verzamelaars klasse

De Collectorsklasse heeft verschillende statische methoden die kant-en-klare verzamelobjecten retourneren — iets voor elke gelegenheid. Hier zullen we de belangrijkste bekijken.

toList()
Een object dat een stream converteert naar een lijst ( List<T>)
toSet()
Een object dat een stream converteert naar een set ( Set<T>)
toMap()
Een object dat een stroom converteert naar een kaart( Map<K, V>)
joining()
Voegt de elementen van een stream samen tot één string
mapping()
Converteert de elementen van een string naar eenMap<K, V>
groupingBy()
Groepeert de elementen en retourneertMap<K, V>

2. Een stream converteren naar een lijst

Het volgende is een typisch voorbeeld van het werken met een stream en het converteren van het resultaat naar een lijst

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() );

We kregen een stream uit de collectie. Toen kregen we een nieuwe stream door alleen strings te behouden waarvan het eerste teken een hoofdletter is. Vervolgens worden alle gegevens van die stream verzameld in een verzameling, die vervolgens wordt geretourneerd.



3. Een stream omzetten in een set

Het volgende is een typisch voorbeeld van het werken met een stream en het converteren van het resultaat naar een set

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() );

Alles lijkt erg op de code voor het converteren van een stream naar een List, alleen gebruiken we een ander verzamelobject, dat wordt geretourneerd door de toSet()methode.



4. Een stroom omzetten in een kaart

Maar het omzetten van een stream naar een kaart is iets moeilijker. Elk item in een kaart bestaat uit twee elementen: een sleutel en een waarde. We moeten uitzoeken hoe we de sleutel en waarde voor elk element in de stream gaan definiëren.

Voorbeeld:

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]) );

Laten we eens kijken wat hier aan de hand is.

In de eerste regel gebruiken we map(...)om elke string om te zetten in een reeks strings. Met behulp van de split-methode splitsen we elke string in twee delen.

In de tweede regel geven we aan de filter()methode alleen die arrays door die precies twee elementen bevatten. De d==3string wordt gesplitst in een array van drie elementen, wat niet overeenkomt met het filter.

En tot slot, in de laatste regel, zetten we de stream om in een Map<String, String>. Er worden twee functies aan de toMap()methode doorgegeven. Voor elk element van de stream moet de eerste functie de sleutel retourneren en de tweede de waarde .

Het eerste element van elke array ("a", "b", "c") zal onze sleutel zijn en het tweede element van elke array ("2", "3", "4") zal onze waarde zijn.



5. Een stream converteren naar een string

Een ander interessant verzamelobject wordt geretourneerd door Collectors.joining(). Het converteert alle elementen van een stream naar Stringen voegt ze samen tot een enkele string. Voorbeeld

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