1. Colectarea elementelor

În cele din urmă, am ajuns la cea mai interesantă metodă din Streamclasă, collect()metoda. Este folosit pentru a trece de la fluxuri la colecțiile noastre familiare — List<T>, Set<T>, Map<T, R>și altele.

Metoda ia ca argument collect()un obiect special . collectorAcest obiect citește toate datele din flux, le convertește într-un anumit tip de colecție și le returnează. Și apoi metoda de colectare în sine returnează această colecție.

Toate acestea se fac într-o manieră destul de zgomotoasă: collectortipul obiectului este Collector<T, A, R>. După cum puteți vedea, are trei parametri de tip. Ultimul parametru de tip ( R) este de obicei un tip ca List<T>. Aceasta înseamnă că compilatorul poate folosi acest tip pentru a determina tipul de returnare corect pentru collect()metoda în sine.

Sper că nu ești prea confuz. În orice caz, nu trebuie să creați singur obiecte Collector. Obiectele gata făcute returnate de metodele statice ale Collectorsclasei vor fi suficiente.

Clasa de colecționari

Clasa Collectorsare mai multe metode statice care returnează obiecte de colecție gata făcute - ceva pentru fiecare ocazie. Aici le vom lua în considerare pe cele mai importante.

toList()
Un obiect care convertește un flux într-o listă ( List<T>)
toSet()
Un obiect care convertește un flux într-un set ( Set<T>)
toMap()
Un obiect care convertește un flux într-o hartă ( Map<K, V>)
joining()
Concatenează elementele unui flux într-un singur șir
mapping()
Convertește elementele unui șir în aMap<K, V>
groupingBy()
Grupează elementele și returneazăMap<K, V>

2. Transformarea unui flux într-o listă

Următorul este un exemplu tipic de lucru cu un flux și de conversie a rezultatului într-o listă

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

Am primit un flux din colecție. Apoi am primit un nou flux reținând numai șiruri de caractere al căror prim caracter este majuscule. Apoi toate datele din acel flux sunt colectate într-o colecție, care este apoi returnată.



3. Transformarea unui flux într-un set

Următorul este un exemplu tipic de lucru cu un flux și de conversie a rezultatului într-un set

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

Totul este foarte asemănător cu codul pentru conversia unui flux într-un List, doar că folosim un obiect colector diferit, care este returnat de toSet()metodă.



4. Transformarea unui flux într-o hartă

Dar convertirea unui flux într-o hartă este puțin mai dificilă. Fiecare intrare dintr-o hartă constă din două elemente: o cheie și o valoare. Trebuie să ne dăm seama cum vom defini cheia și valoarea pentru fiecare element din flux.

Exemplu:

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

Să aruncăm o privire la ce se întâmplă aici.

În prima linie, folosim map(...)pentru a converti fiecare șir într-o matrice de șiruri. Folosind metoda split, împărțim fiecare șir în două părți.

În a doua linie, trecem la filter()metodă doar acele tablouri care conțin exact două elemente. Șirul d==3este împărțit într-o matrice de trei elemente, care nu se potrivește cu filtrul.

Și, în sfârșit, în ultima linie, convertim fluxul într-un Map<String, String>. Două funcții sunt transmise metodei toMap(). Pentru fiecare element al fluxului, prima funcție ar trebui să returneze cheia , iar a doua returnează valoarea .

Primul element al fiecărei matrice ("a", "b", "c") va fi cheia noastră, iar al doilea element al fiecărei matrice ("2", "3", "4") va fi valoarea noastră.



5. Convertirea unui flux într-un șir

Un alt obiect de colecție interesant este returnat de Collectors.joining(). Convertește toate elementele unui flux Stringși le concatenează într-un singur șir. Exemplu

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