JavaRush /Kurslar /All lectures for UZ purposes /Potoklar bilan ishlash, 3-qism

Potoklar bilan ishlash, 3-qism

All lectures for UZ purposes
Daraja , Dars
Mavjud

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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(barcha elementlar nolga teng emas)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(nolga teng yoki manfiy elementlar mavjud)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true


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
class Optional<Tип>
{
   private final Tип value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Tип> Optional<Tип> of(Tип value)
   {
      return new Optional<Tип>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Tип get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Tип orElse(Tип other)
   {
      return value != null ? value : other;
   }

   public Tип orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










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
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

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();
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION