1. Samle elementer
Endelig har vi nådd den mest interessante metoden i Stream
klassen, collect()
metoden. Den brukes til å flytte fra strømmer til våre kjente samlinger - List<T>
, Set<T>
, Map<T, R>
og andre.
Metoden collect()
tar et spesielt collector
objekt som argument. Dette objektet leser all data fra strømmen, konverterer den til en bestemt type samling og returnerer den. Og så returnerer selve innsamlingsmetoden denne samlingen.
Alt dette gjøres på en ganske glatt måte: collector
objektets type er Collector<T, A, R>
. Som du kan se, har den tre typeparametere. Den siste typeparameteren ( R
) er vanligvis en type som List<T>
. Dette betyr at kompilatoren kan bruke denne typen til å bestemme riktig returtype for collect()
selve metoden.
Jeg håper du ikke er for forvirret. I alle fall trenger du ikke lage Collector-objekter selv. De ferdiglagde objektene som returneres av de statiske metodene til Collectors
klassen vil være tilstrekkelig.
Samlerklasse _
Klassen Collectors
har flere statiske metoder som returnerer ferdige samleobjekter — noe for enhver anledning. Her skal vi vurdere de viktigste.
|
Et objekt som konverterer en strøm til en liste ( List<T> ) |
|
Et objekt som konverterer en strøm til et sett ( Set<T> ) |
|
Et objekt som konverterer en strøm til et kart( Map<K, V> ) |
|
Sammenslår elementene i en strøm til en enkelt streng |
|
Konverterer elementene i en streng til enMap<K, V> |
|
Grupperer elementene og returnererMap<K, V> |
2. Konvertere en strøm til en liste
Følgende er et typisk eksempel på å jobbe med en strøm og konvertere resultatet til 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() );
Vi fikk en strøm fra samlingen. Så fikk vi en ny strøm ved å beholde bare strenger hvis første tegn er store bokstaver. Deretter samles alle dataene fra den strømmen til en samling, som deretter returneres.
3. Konvertere en strøm til et sett
Følgende er et typisk eksempel på å jobbe med en strøm og konvertere resultatet til et sett
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() );
Alt er veldig likt koden for å konvertere en strøm til en List
, bare vi bruker et annet samleobjekt, som returneres av metoden toSet()
.
4. Konvertere en bekk til et kart
Men å konvertere en strøm til et kart er litt vanskeligere. Hver oppføring i et kart består av to elementer: en nøkkel og en verdi. Vi må finne ut hvordan vi skal definere nøkkelen og verdien for hvert element i strømmen.
Eksempel:
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]) );
La oss ta en titt på hva som skjer her.
I den første linjen bruker vi map(...)
å konvertere hver streng til en rekke strenger. Ved å bruke splittmetoden deler vi hver streng i to deler.
I den andre linjen overfører vi til filter()
metoden bare de matrisene som inneholder nøyaktig to elementer. Strengen d==3
deles opp i en rekke med tre elementer, som ikke samsvarer med filteret.
Og til slutt, i den siste linjen, konverterer vi strømmen til en Map<String, String>
. To funksjoner overføres til toMap()
metoden. For hvert element i strømmen skal den første funksjonen returnere nøkkelen , og den andre returnerer verdien .
Det første elementet i hver matrise ("a", "b", "c") vil være vår nøkkel, og det andre elementet i hver matrise ("2", "3", "4") vil være vår verdi.
5. Konvertere en strøm til en streng
Et annet interessant samlerobjekt returneres av Collectors.joining()
. Den konverterer alle elementene i en strøm til String
og setter dem sammen til en enkelt streng. Eksempel
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );