Ma'lumot oqimlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Java 8 yangiliklari: Funksional dasturlash

Java 8 bilan birga funksional dasturlashning kuchli qo'llab-quvvatlanishi paydo bo'ldi. Hatto shuni aytish mumkinki, bu kutgandek qo'llab-quvvatlash edi. Kod yozish tezroq bo'ldi, lekin uni o'qish qiyinroq bo'ldi 🙂

Java-dagi funksional dasturlashni o'rganmasdan oldin, uchta narsani yaxshi tushunishni tavsiya qilamiz:

  1. OOP, vorislik va interfeyslar (1-2 daraja Java Core kvestlari).
  2. Interfeysdagi default metodlar.
  3. Ichki va anonim sinflar.

Yaxshi yangilik shu ki, bularni bilmasdan ham Java'da funksional dasturlashning ko'plab imkoniyatlaridan foydalanishingiz mumkin. Yomon yangilik — aynan qanday qilib hammasi tashkil etilganini tushunish juda qiyin bo'ladi, bularsiz ichki anonim sinflar.

Yaqin darslarda biz qanday qilib oson va oddiy foydalanish mumkinligiga e'tibor qaratamiz funksional dasturlash imkoniyatlaridan foydalanish, uning qanday ishlashini chuqur tushunmasdan.

Java'dagi funksional dasturlashning barcha nozik tomonlarini tushunish uchun oylar kerak. Ammo bunday kodni o'qishga bir necha soat kifoya qiladi. Shuning uchun kichik narsalardan boshlashni tavsiya qilamiz. Masalan, kirish-chiqish oqimlaridan.


2. Kirish-chiqish oqimlari: oqimlar zanjiri

Eslaysizmi, bir vaqtlar siz kirish-chiqish oqimlarini o'rgangan edingiz: InputStream, OutputStream, Reader, Writer va boshqalar?

Ma'lumotlarni manbalardan o'qiydigan oqim sinflari mavjud edi, masalan FileInputSteam, va boshqa oqimlardan ma'lumotlarni o'qiydigan oraliq oqimlar, masalan InputStreamReader va BufferedReader.

Bu oqimlarni ma'lumotlarni qayta ishlash zanjirlariga tashkil etish mumkin edi. Masalan, shunday:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

Bir necha qator kodda biz faqat Stream obyektlaridan tashkil etilgan zanjir yaratamiz, lekin bu oqimlar orqali haqiqiy ma'lumotlar hali o'tkazilmayapti.

Faqat biz buff.readLine() metodini chaqirganimizda quyidagi amallar sodir bo'ladi:

  1. BufferedReader obyekti read() metodini InputStreamReader obyektidan chaqiradi
  2. InputStreamReader obyekti read() metodini FileInputStream obyektidan chaqiradi
  3. FileInputStream obyekti fayldan ma'lumotlarni o'qishni boshlaydi

Ya'ni, biz read() yoki readLine() kabi metodlarni chaqirmagunimizcha, oqimlar zanjiri orqali hech qanday ma'lumotlar harakati yo'q. Oqimlar zanjirini qurish jarayoni orqali ma'lumotlarni o'tkazmaydi. Oqimlar o'zlari ma'lumotlarni saqlamaydi, faqat boshqalardan o'qiydi.

Kolleksiyalar va oqimlar

Java 8 versiyasidan boshlab, kolleksiyalardan (va faqat ulardan emas) ma'lumotlarni o'qish uchun oqim olish imkoniyati paydo bo'ldi. Ammo bu hali ham qiziqarli emas. Aslida, ma'lumotlar oqimlarining murakkab zanjirlarini oson va oddiy ravishda yaratish imkoniyati paydo bo'ldi, bunda ilgari 5-10 qator kod talab qilgan bo'lsa, endi uni 1-2 qatorga yozish mumkin bo'ldi.

Misol — satrlar ro'yxatida eng uzun satrni topamiz:

Eng uzun satrni 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();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Stream interfeysi

Java 8'dagi oqimlarni kengaytirilgan qo'llab-quvvatlash Stream<T> interfeysi yordamida amalga oshiriladi. Bu yerda T – oqim orqali uzatiladigan ma'lumotlar turini belgilovchi parametr turi. Boshqa so'zlar bilan aytganda, oqim uzatuvchi ma'lumotlar turidan butunlay mustaqil.

Kolleksiyadan oqim obyektini olish uchun unga stream() metodini chaqirish yetarli. Bu kod taxminan quyidagicha ko'rinadi:

Stream<Тип> ism = kollektsiya.stream();
Kolleksiya tomonidan oqim olish

Bunda kolleksiya oqimning ma'lumotlar manbai hisoblanadi, va Stream<Тип> turi obyekti – kolleksiyadagi ma'lumotlarni oqim shaklida olish uchun asbob hisoblanadi.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salom", "qanday", "ishlar?");
Stream<String> stream = list.stream();

Qiziq tomoni shundaki, siz oqimni faqat massivdan emas, balki olish imkoniga ham egasiz. Buning uchun Arrays.stream(); metodidan foydalanish kerak. Misol:

Stream<Тип> ism = Arrays.stream(massiv);
Massivdan oqim olish

Bunda massiv oqim ism uchun ma'lumotlar manbai hisoblanadi.

Integer[] aray = {1, 2, 3};
Stream<Integer> oqim = Arrays.stream(aray);

Stream<Тип> obyekti yaratilgandan so'ng, hech qanday ma'lumotlar harakati sodir bo'lmaydi. Biz faqat oqim obyektini oldik, shunda oqimlar zanjirini tuzishni boshlashimiz mumkin.


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