Java'da Kollektorlar

All lectures for UZ purposes
Daraja , Dars
Mavjud

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:

toList()
Potokni ro'yxatga aylantiruvchi obyekt — List<T>
toSet()
Potokni ko'plikka aylantiruvchi obyekt — Set<T>
toMap()
Potokni xaritaga aylantiruvchi obyekt — Map<K, V>
joining()
Potok elementlarini bitta qatorga birlashtiradi
mapping()
Potok elementlarini Map<K, V> ga aylantiradi
groupingBy()
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(", ") );

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION