1. Indsamling af elementer

Endelig er vi nået til den mest interessante metode i Streamklassen, collect()metoden. Det bruges til at flytte fra streams til vores velkendte samlinger - List<T>, Set<T>, Map<T, R>og andre.

Metoden collect()tager et særligt collectorobjekt som argument. Dette objekt læser alle data fra strømmen, konverterer dem til en bestemt slags samling og returnerer dem. Og så returnerer selve indsamlingsmetoden denne samling.

Alt dette gøres på en ret glat måde: collectorobjektets type er Collector<T, A, R>. Som du kan se, har den tre typeparametre. Den sidste type parameter ( R) er normalt en type som List<T>. Dette betyder, at compileren kan bruge denne type til at bestemme den korrekte returtype for collect()selve metoden.

Jeg håber ikke du er for forvirret. Under alle omstændigheder behøver du ikke selv oprette Collector-objekter. De færdige objekter, der returneres af klassens statiske metoder, Collectorsvil være tilstrækkelige.

Samler klasse

Klassen Collectorshar flere statiske metoder, der returnerer færdige samlerobjekter - noget til enhver lejlighed. Her vil vi overveje de vigtigste.

toList()
Et objekt, der konverterer en strøm til en liste ( List<T>)
toSet()
Et objekt, der konverterer en strøm til et sæt ( Set<T>)
toMap()
Et objekt, der konverterer en strøm til et kort( Map<K, V>)
joining()
Sammenkæder elementerne i en strøm til en enkelt streng
mapping()
Konverterer elementerne i en streng til enMap<K, V>
groupingBy()
Grupperer elementerne og returnererMap<K, V>

2. Konvertering af en strøm til en liste

Det følgende er et typisk eksempel på at arbejde 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 fik en stream fra samlingen. Så fik vi en ny strøm ved kun at beholde strenge, hvis første tegn er stort. Derefter samles alle data fra den strøm til en samling, som derefter returneres.



3. Konvertering af en stream til et sæt

Det følgende er et typisk eksempel på at arbejde med en strøm og konvertere resultatet til et sæt

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 ligner meget koden til at konvertere en strøm til en List, kun vi bruger et andet samleobjekt, som returneres af metoden toSet().



4. Konvertering af et vandløb til et kort

Men at konvertere en strøm til et kort er lidt sværere. Hver post i et kort består af to elementer: en nøgle og en værdi. Vi skal finde ud af, hvordan vi vil definere nøglen og værdien 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]) );

Lad os tage et kig på, hvad der foregår her.

I den første linje bruger vi map(...)til at konvertere hver streng til en række strenge. Ved at bruge splitmetoden opdeler vi hver streng i to dele.

I den anden linje videregiver vi filter()kun de arrays til metoden, der indeholder præcis to elementer. Strengen d==3opdeles i en række af tre elementer, som ikke matcher filteret.

Og til sidst, i den sidste linje, konverterer vi strømmen til en Map<String, String>. To funktioner overføres til toMap()metoden. For hvert element i strømmen skal den første funktion returnere nøglen , og den anden returnerer værdien .

Det første element i hvert array ("a", "b", "c") vil være vores nøgle, og det andet element i hver array ("2", "3", "4") vil være vores værdi.



5. Konvertering af en strøm til en streng

Et andet interessant samlerobjekt returneres af Collectors.joining(). Det konverterer alle elementer i en strøm til Stringog sammenkæder dem 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(", ") );