1. Pagkolekta ng mga elemento

Sa wakas, naabot na namin ang pinakakawili-wiling paraan sa Streamklase, 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 collectorna 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 collectoruri 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 Collectorsklase ay magiging sapat.

Klase ng mga kolektor

Ang Collectorsklase 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.

toList()
Isang bagay na nagko-convert ng stream sa isang listahan ( List<T>)
toSet()
Isang bagay na nagko-convert ng stream sa isang set ( Set<T>)
toMap()
Isang bagay na nagko-convert ng stream sa isang mapa( Map<K, V>)
joining()
Pinagsasama-sama ang mga elemento ng isang stream sa isang solong string
mapping()
Kino-convert ang mga elemento ng isang string sa aMap<K, V>
groupingBy()
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==3Nahahati 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 Stringat 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(", ") );