1. Elementlar to'plami
Nihoyat biz Stream sinfining eng qiziqarli metodiga yetib keldik — bu collect()
metodi. U orqali stream'larni odatiy kolleksiyalarga — List<T>
, Set<T>
, Map<T, R>
va boshqalarga o'tish mumkin.
Metod collect()
ga maxsus bir obyekt — collector
ni uzatish kerak. U stream'dan barcha ma'lumotlarni o'qiydi, ularni ma'lum bir kolleksiyaga aylantiradi va qaytaradi. Keyin shu kolleksiya metod collect'ning o'zi tomonidan ham qaytariladi.
Barchasi juda aqlli qilib qurilgan: collector
obyekti Collector<T, A, R>
turiga ega – uchta tur parametri bor. Oxirgi turi R
odatda List<T>
kabi turdir. Shu sababdan kompilyator bu tur orqali collect()
metodining natijasining to'g'ri turini o'rnatishi mumkin.
Umid qilamanki, chalkashib ketmadingiz. Har holda, Collector turidagi obyektlarni o'zingiz yaratishingiz shart emas. Collectors
sinfining statistik metodlari tomonidan qaytarilgan allaqachon tayyor obyektlardan foydalanish kifoya.
Collectors klassi
Collectors
klassida har qanday holatlar uchun tayyor kollektor-obyektlarni qaytaruvchi bir nechta statik metodlar mavjud. Ularning soni bir necha o'n, lekin biz asosiylarini ko'rib chiqamiz:
|
Potokni ro'yxatga aylantiruvchi obyekt — List<T> |
|
Potokni ko'plikka aylantiruvchi obyekt — Set<T> |
|
Potokni xaritaga aylantiruvchi obyekt — Map<K, V> |
|
Potok elementlarini bitta qatorga birlashtiradi |
|
Potok elementlarini Map<K, V> ga aylantiradi |
|
Elementlarni guruhlaydi, Map <K, V> ni qaytaradi |
2. Potokni ro'yxatga aylantirish
Potok bilan ishlov berish va natijani ro'yxatga aylantirish odatiy tarzi mana bunday ko'rinishda
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Салом", "қалейсан", "ишлар?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
Biz kolleksiyadan potok oldik, keyin undan yangi potok oldik, faqat birinchi belgisi katta bo'lgan satrlarni filtrladik. Keyin oxirgi potokdan barcha ma'lumotlarni yig'dik va kolleksiyani qaytardik.
3. Potokni ko'plikka aylantirish
Potok bilan ishlov berish va natijani ko'plikka aylantirish odatiy tarzi mana bunday ko'rinishda
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Салом", "қалейсан", "ишлар?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
Hamma narsa potokni List
ga aylantirish kodi bilan juda o'xshash, faqat boshqa kollektor-obyekt ishlatiladi, u metod toSet();
ni qaytaradi
4. Potokni xaritaga aylantirish
Potokni xaritaga aylantirish biroz qiyinroq. Chakki har bir Map obyekti ikki elementdan - kalit va qiymatdan iborat. Biz potok elementidan kalitni qanday aniqlashimizni va qiymatni qanday aniqlashimizni o'ylab topishimiz kerak.
Misol.
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]) );
Keling nima sodir bo'layotganini tushunib chiqamiz.
map(...)
ning birinchi qatorida biz har bir qatorni satrlar massivi ichiga o'zgartiramiz. split
metodidan foydalanib, har bir qatorni belgi "teng" orqali ikkita qismga bo'lamiz.
filter()
metodining ikkinchi qatorida faqat ikkita elementdan iborat bo'lgan massiv elementlarini filtr orqali o'tkazib yuboramiz. d == 3
elementi uchta elementdan iborat bo'lgan massivga ajraladi va filtrdan o'tmaydi.
Va nihoyat, oxirgi qatorida biz potokni Map<String, String>
ga aylantiramiz. toMap()
metodiga ikki funksiya uzatiladi. Har bir potok elementi uchun birinchi funksiya kalitni qaytarishi kerak va ikkinchisi - qiymatni.
Bizda kalit sifatida massivning birinchi elementi ("a", "b", "c") bo'ladi va qiymat sifatida massivning ikkinchi elementi: "2", "3", "4" bo'ladi.
5. Potokni satrga aylantirish
Yana bir qiziqarli kollektor-obyekt bu Collectors.joining()
. U potokning barcha elementlarini String
turiga o'zgartiradi va ularni bitta qatorga birlashtiradi. Misol
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