1. Pagkolekta ng mga elemento
Sa wakas, naabot na namin ang pinakakawili-wiling paraan sa Stream
klase, ang collect()
pamamaraan. Ginagamit ito upang lumipat mula sa mga stream patungo sa aming mga pamilyar na koleksyon — List<T>
, Set<T>
, Map<T, R>
at iba pa.
Ang collect()
pamamaraan ay tumatagal ng isang espesyal collector
na bagay bilang isang argumento. Binabasa ng object na ito ang lahat ng data mula sa stream, kino-convert ito sa isang partikular na uri ng koleksyon, at ibinabalik ito. At pagkatapos ay ibinabalik ng mismong paraan ng pagkolekta ang koleksyong ito.
Ginagawa ang lahat ng ito sa medyo makinis na paraan: ang collector
uri ng bagay ay Collector<T, A, R>
. Tulad ng nakikita mo, mayroon itong tatlong uri ng mga parameter. Ang huling uri ng parameter ( R
) ay karaniwang isang uri tulad ng List<T>
. Nangangahulugan ito na magagamit ng compiler ang ganitong uri upang matukoy ang tamang uri ng pagbabalik para sa collect()
mismong pamamaraan.
Sana hindi ka masyadong nalilito. Sa anumang kaso, hindi mo kailangang gumawa ng mga bagay ng Kolektor sa iyong sarili. Ang mga handa na bagay na ibinalik ng mga static na pamamaraan ng Collectors
klase ay magiging sapat.
Klase ng mga kolektor
Ang Collectors
klase ay may ilang mga static na pamamaraan na nagbabalik ng mga yari nang collector object — isang bagay para sa bawat okasyon. Dito natin isasaalang-alang ang pinakamahalaga.
|
Isang bagay na nagko-convert ng stream sa isang listahan ( List<T> ) |
|
Isang bagay na nagko-convert ng stream sa isang set ( Set<T> ) |
|
Isang bagay na nagko-convert ng stream sa isang mapa( Map<K, V> ) |
|
Pinagsasama-sama ang mga elemento ng isang stream sa isang solong string |
|
Kino-convert ang mga elemento ng isang string sa aMap<K, V> |
|
Ipangkat ang mga elemento at ibinabalikMap<K, V> |
2. Pag-convert ng stream sa isang listahan
Ang sumusunod ay isang tipikal na halimbawa ng pagtatrabaho sa isang stream at pag-convert ng resulta sa isang listahan
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() );
Nakakuha kami ng stream mula sa koleksyon. Pagkatapos ay nakakuha kami ng bagong stream sa pamamagitan ng pagpapanatili lamang ng mga string na ang unang character ay uppercase. Pagkatapos ang lahat ng data mula sa stream na iyon ay kinokolekta sa isang koleksyon, na pagkatapos ay ibabalik.
3. Pag-convert ng stream sa isang set
Ang sumusunod ay isang tipikal na halimbawa ng pagtatrabaho sa isang stream at pag-convert ng resulta sa isang 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() );
Ang lahat ay halos kapareho sa code para sa pag-convert ng isang stream sa isang List
, tanging kami ay gumagamit ng ibang bagay ng kolektor, na ibinalik sa pamamagitan ng toSet()
pamamaraan.
4. Pag-convert ng stream sa isang mapa
Ngunit ang pag-convert ng stream sa isang mapa ay medyo mas mahirap. Ang bawat entry sa isang Map ay binubuo ng dalawang elemento: isang susi at isang halaga. Kailangan nating malaman kung paano natin tutukuyin ang susi at halaga para sa bawat elemento sa stream.
Halimbawa:
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]) );
Tingnan natin kung ano ang nangyayari dito.
Sa unang linya, ginagamit namin map(...)
upang i-convert ang bawat string sa isang hanay ng mga string. Gamit ang split method, hinati namin ang bawat string sa dalawang bahagi.
Sa pangalawang linya, ipinapasa namin sa filter()
pamamaraan lamang ang mga array na naglalaman ng eksaktong dalawang elemento. d==3
Nahahati ang string sa hanay ng tatlong elemento, na hindi tumutugma sa filter.
At sa wakas, sa huling linya, kino-convert namin ang stream sa isang Map<String, String>
. Dalawang function ang ipinasa sa toMap()
pamamaraan. Para sa bawat elemento ng stream, dapat ibalik ng unang function ang key , at ibabalik ng pangalawa ang value .
Ang unang elemento ng bawat array ("a", "b", "c") ang magiging susi natin, at ang pangalawang elemento ng bawat array ("2", "3", "4") ang magiging value natin.
5. Pag-convert ng stream sa isang string
Ang isa pang kawili-wiling bagay ng kolektor ay ibinalik ng Collectors.joining()
. Kino-convert nito ang lahat ng elemento ng isang stream String
at pinagsasama-sama ang mga ito sa isang string. Halimbawa
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