1. Colectarea elementelor
În cele din urmă, am ajuns la cea mai interesantă metodă din Stream
clasă, 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 . collector
Acest 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ă: collector
tipul 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 Collectors
clasei vor fi suficiente.
Clasa de colecționari
Clasa Collectors
are 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.
|
Un obiect care convertește un flux într-o listă ( List<T> ) |
|
Un obiect care convertește un flux într-un set ( Set<T> ) |
|
Un obiect care convertește un flux într-o hartă ( Map<K, V> ) |
|
Concatenează elementele unui flux într-un singur șir |
|
Convertește elementele unui șir în aMap<K, V> |
|
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==3
este î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(", ") );
GO TO FULL VERSION