1. Samla element
Äntligen har vi nått den mest intressanta metoden i Stream
klassen, 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 collector
objekt 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: collector
objektets 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 Collectors
kommer att räcka.
Samlare klass
Klassen Collectors
har 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.
|
Ett objekt som konverterar en ström till en lista ( List<T> ) |
|
Ett objekt som omvandlar en ström till en uppsättning ( Set<T> ) |
|
Ett objekt som omvandlar en ström till en karta( Map<K, V> ) |
|
Sammanfogar elementen i en ström till en enda sträng |
|
Konverterar elementen i en sträng till enMap<K, V> |
|
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 , List
bara 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==3
delas 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 String
och 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(", ") );