1. Samle elementer

Endelig har vi nådd den mest interessante metoden i Streamklassen, 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 collectorobjekt 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: collectorobjektets 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 Collectorsklassen vil være tilstrekkelig.

Samlerklasse _

Klassen Collectorshar flere statiske metoder som returnerer ferdige samleobjekter — noe for enhver anledning. Her skal vi vurdere de viktigste.

toList()
Et objekt som konverterer en strøm til en liste ( List<T>)
toSet()
Et objekt som konverterer en strøm til et sett ( Set<T>)
toMap()
Et objekt som konverterer en strøm til et kart( Map<K, V>)
joining()
Sammenslår elementene i en strøm til en enkelt streng
mapping()
Konverterer elementene i en streng til enMap<K, V>
groupingBy()
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==3deles 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 Stringog 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(", ") );