1. Samla element

Äntligen har vi nått den mest intressanta metoden i Streamklassen, collect()metoden. Den används för att flytta från strömmar till våra välbekanta samlingar — , , List<T>och Set<T>andra Map<T, R>.

Metoden collect()tar ett speciellt collectorobjekt som argument. Detta objekt läser all data från strömmen, konverterar den till en specifik typ av samling och returnerar den. Och sedan returnerar själva insamlingsmetoden denna samling.

Allt detta görs på ett ganska smart sätt: collectorobjektets typ är Collector<T, A, R>. Som du kan se har den tre typparametrar. Den sista typparametern ( R) är vanligtvis en typ som List<T>. Detta innebär att kompilatorn kan använda denna typ för att bestämma rätt returtyp för collect()själva metoden.

Jag hoppas att du inte är för förvirrad. Du behöver i alla fall inte skapa Collector-objekt själv. De färdiga objekten som returneras av klassens statiska metoder Collectorskommer att räcka.

Samlare klass

Klassen Collectorshar flera statiska metoder som returnerar färdiga samlarföremål — något för alla tillfällen. Här kommer vi att överväga de viktigaste.

toList()
Ett objekt som konverterar en ström till en lista ( List<T>)
toSet()
Ett objekt som omvandlar en ström till en uppsättning ( Set<T>)
toMap()
Ett objekt som omvandlar en ström till en karta( Map<K, V>)
joining()
Sammanfogar elementen i en ström till en enda sträng
mapping()
Konverterar elementen i en sträng till enMap<K, V>
groupingBy()
Grupperar elementen och returnerarMap<K, V>

2. Konvertera en ström till en lista

Följande är ett typiskt exempel på att arbeta med en ström och konvertera resultatet till en lista

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

Vi fick en stream från samlingen. Sedan fick vi en ny stream genom att bara behålla strängar vars första tecken är versaler. Sedan samlas all data från den strömmen till en samling som sedan returneras.



3. Konvertera en ström till en uppsättning

Följande är ett typiskt exempel på att arbeta med en ström och konvertera resultatet till en uppsättning

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

Allt är väldigt likt koden för att konvertera en ström till en , Listbara vi använder ett annat samlarobjekt, som returneras av metoden toSet().



4. Konvertera en ström till en karta

Men att konvertera en ström till en karta är lite svårare. Varje post i en karta består av två element: en nyckel och ett värde. Vi måste ta reda på hur vi ska definiera nyckeln och värdet för varje element i strömmen.

Exempel:

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

Låt oss ta en titt på vad som händer här.

På den första raden använder vi map(...)för att konvertera varje sträng till en array av strängar. Med splitmetoden delar vi upp varje sträng i två delar.

På den andra raden överför vi till filter()metoden endast de arrayer som innehåller exakt två element. Strängen d==3delas upp i en array med tre element, som inte matchar filtret.

Och slutligen, på sista raden, omvandlar vi strömmen till en Map<String, String>. Två funktioner överförs till toMap()metoden. För varje element i strömmen ska den första funktionen returnera nyckeln och den andra returnerar värdet .

Det första elementet i varje array ("a", "b", "c") kommer att vara vår nyckel, och det andra elementet i varje array ("2", "3", "4") kommer att vara vårt värde.



5. Konvertera en ström till en sträng

Ett annat intressant samlarobjekt returneras av Collectors.joining(). Det konverterar alla element i en ström till Stringoch sammanfogar dem till en enda sträng. Exempel

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