1. Tekshirish
O'ylaymanki, ma'lumot potoklaridan foydalanishni qanday qurishni o'rganish sizga zerikarli bo'lib qolgan. Nihoyat, ushbu ma'lumotlar bilan nimadir qilishni xohlaysiz.
Stream
klassida uchta standart metod mavjud bo'lib, ular potoklarni qurmaydi, balki potoklar ichida qanday ma'lumotlar mavjudligini tekshiradi. Bu metodlar: anyMatch()
, allMatch()
va noneMatch()
.
Метод boolean anyMatch(правило)
Ushbu metod potokda kamida bir element borligini tekshiradi, u metodga uzatilgan qoidaga javob beradi. Agar bunday element mavjud bo'lsa, metod true
qaytaradi, aks holda — false
.
Misollar
Kod | Izoh |
---|---|
|
|
|
|
|
|
So'nggi misolda biz birinchi bo'lib barcha manfiy elementlarni filtrlaymiz (filtrdan o'tkazamiz), so'ngra ular orasida nolga teng bo'lmagan bir element borligini tekshiramiz. Aniq bir narsa, bunday elementlar qolmaydi.
Метод boolean allMatch(правило)
Ushbu metod potokdagi barcha elementlar qoidaga mos kelishini tekshiradi. Qoida metodga parametr sifatida o’tkaziladi:
Kod | Izoh |
---|---|
|
(barcha elementlar nolga teng emas) |
|
(nolga teng yoki manfiy elementlar mavjud) |
|
(nolga teng bo'lmagan elementlar filtrdan o'tkazildi) |
So'nggi misolda biz manfiy bo'lgan elementlarni filtrlaymiz va keyin ular orasida, barcha elementlar nolga teng emas ekanligini tekshiramiz. Tekshirish muvaffaqiyatli o'tdi.
Метод boolean noneMatch(правило)
Метод noneMatch()
натуральной aðр оқимда ўша енг кичкина στοιχεί e olganda ни хо́! gини кичкина бир эле̄мент yo'qligini tekshiradi, u qoidaga muvofiq keladi. Бу методни синтаксиси anyMatch()
методини амалga оширилганга қарама-қарши.
Kod | Izoh |
---|---|
|
|
|
|
|
|
2. Qo'llab quvvatlovchi klasslar: Optional
klassi
Ba'zida dasturchilar null
ga bog'langan havolalar bilan ishlash juda noqulay. Misol uchun, siz ikkita qatorni taqqoslaysiz. Agar ikkala o'zgaruvchi null
bo'lmasa, unda s1.equals(s2)
ni chaqirishingiz mumkin, va hammasi ishlaydi. Ammo agar s1
null
bo'lishi mumkin bo'lsa, NullPointerException
ni yuzaga keltirmaslik uchun bu vaziyatni hisobga oladigan kod yozishingiz kerak bo'ladi.
Shu sababli dasturchilar Optional<T>
yordamchi klassini o'ylab topdilar. Uning kodi taxminan quyidagicha ko'rinadi:
Kod | Izoh |
---|---|
|
Ichkarida qiymat (havola null emas) borligini tekshiradi. Ob'ekt null havolasini saqlayotganligini tekshiradi. Saqlanayotgan qiymatni qaytaradi. Agar qiymat mavjud bo'lmasa, istisno chiqaradi. Qiymatni qaytaradi, yoki agar ichkarida null bo'lsa, metodga uzatilgan ikkinchi qiymatni qaytaradi. Qiymatni qaytaradi yoki agar qiymat mavjud bo'lmasa, istisno chiqaradi. |
Ushbu sinfning maqsadi - T tipidagi ob'ektni (T tipidagi ob'ektga havolani) o'zida saqlashdir. Optional<T>
klassining ichida joylashgan ob'ektga havola null
bo'lishi mumkin.
Ushbu sinf dasturchilarga kod yozishni biroz estetikroq yozishga imkon beradi. Taqqoslang:
Optional ishlatib | Optional ishlatmay |
---|---|
|
|
Har doim Optional
ob'ektini boshqa Optional
ob'ekti bilan equals
metodi yordamida taqqoslash mumkin, hatto ular o'zlarida null
havolarni saqlab tursa ham.
Qo'pol qilib aytganda, Optional klassi null
tekshiruvlarini va agar Optional
ob'ekt ichida null
saqlansa, nima qilish kerakligini "chiroyliroq" yozishga imkon beradi.
3. Elementlarni qidirish
Stream klassiga qaytamiz. Stream klassida potokda elementlarni qidirishga imkon beruvchi 4 ta metod mavjud. Bu metodlar findFirst()
, findAny()
, min()
va max()
.
Метод Optional<T> findFirst()
Метод findFirst()
oqimdan birinchi elementni qaytaradi va Optional<T>
ob'ektini qaytaradi, shuning uchun hech qachon holatga tushmaymiz, bu metod mavjud bo'lmagan paytda null
qaytarishi mumkin.
Misol:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
String str = list.stream().findFirst().get(); // Salom
Ko'proq aniqlik uchun oxirgi qatorni bir nechta qatorlarga ajratamiz:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Salom
So'nggi get()
metodi - bu shunchaki Optional
ob'ekti ichidagi qiymatni chiqarib olish.
Метод Optional<T> findAny()
Метод findAny()
oqimdan har qanday elementni qaytaradi va shunda tugaydi. Ushbu metod findFirst()
metodining paralel ishlov berish uchun ekvivalenti hisoblanadi.
Agar paralel ishlov berishda potokning ba'zi qismida allaqachon element topilgan bo'lsa, lekin u birinchi bo'lishi mumkinmi yoki yo'qmi aniq emas.
Agar filtrdan o'tgan elementlar ko'p bo'lsa va dasturchi ular orasidan birinchi elementni olishni xohlayotgan bo'lsa, unda findFirst()
metodini chaqirish kerak. Agar dasturchi haqiqatdan ham ko'rsatkich orqali faqat 0 yoki 1 element o'tishini bilsa, findAny()
chaqirish kifoya — bu tezroq bo'ladi.
Метод Optional<T> min(Comparator<T>)
min()
metodi potokdagi barcha elementlarni komparator
ob'ekti yordamida taqqoslaydi va eng kichik elementni qaytaradi. Komparator ob'ektini lambda-funksiyasi yordamida osongina o'rnatish mumkin.
Misol - eng qisqa uzunlikdagi qatorni qidirish:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Метод Optional<T> max(Comparator<T>)
max()
metodi potokdagi barcha elementlarni komparator
ob'ekti yordamida taqqoslaydi va eng katta elementni qaytaradi. Komparator ob'ektini lambda-funksiyasi yordamida osongina o'rnatish mumkin.
Misol - eng uzun uzunlikdagi qatorni qidirish:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION