CodeGym /Kurslar /Java SELF AZ /Data axınları

Data axınları

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Java 8 Yenilikləri: Funksional Proqramlaşdırma

Java 8 ilə birlikdə funksional proqramlaşdırma üçün güclü bir dəstək gəldi. Hətta desək ki, çoxdan gözlənilən funksional proqramlaşdırma dəstəyi gəldi. Kod yazmaq daha sürətli oldu, amma oxumaq bir az çətinləşdi 🙂

Funksional proqramlaşdırmanı Java-da öyrənmədən əvvəl, bu üç şeydə yaxşı baş çıxarmağı tövsiyə edirik:

  1. OOP, irsiyyət və interfeyslər (Java Core 1-2 səviyyə kvestləri).
  2. Interfeys metodlarının defolt implementasiyası.
  3. Daxilianonim siniflər.

Yaxşı xəbər budur ki, bütün bu biliklər olmadan da Java-da funksional proqramlaşdırmanın bir çox imkanlarından istifadə etmək mümkündür. Pis xəbər isə — daxili və anonim siniflər kimi mövzuları bilmədən sistemin necə qurulduğunu və necə işlədiyini başa düşmək çətindir.

Ən yaxın mühazirələrdə biz asan və sadə yolla funksional proqramlaşdırmanın imkanlarından necə istifadə edə biləcəyinizə diqqət yetirəcəyik, sistemin dərinliyinə çox girmədən.

Java-da funksional proqramlaşdırmanın bütün incəliklərini başa düşmək üçün aylarla vaxt lazımdır. Amma belə kodun necə oxunacağını bir neçə saatda öyrənmək mümkündür. Ona görə də tədricən başlağıq. Məsələn, giriş-çıxış axınlarından.


2. Giriş-Çıxış Axınları: Axın Zəncirləri

Xatırlayırsınızmı, vaxtilə giriş-çıxış axınlarını öyrənirdiniz: InputStream, OutputStream, Reader, Writer və s.?

Data mənbələrindən, məsələn FileInputSteam kimi, məlumat oxuyan axın sinifləri var idi, və bir də digər axınlardan məlumat oxuyan aralıq data axınları, məsələn InputStreamReaderBufferedReader.

Bu axınları məlumat emalı zəncirlərində təşkil edə bilərdik. Məsələn, belə:

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

String text = buff.readLine();

Qeyd etmək vacibdir ki, ilk bir neçə sətir kodda sadəcə Stream-obyektlərindən bir zəncir qururuq, ancaq bu axın zənciri ilə real məlumatlar hələ ötürülmür.

Və yalnız biz buff.readLine() metodunu çağıranda aşağıdakılar baş verir:

  1. BufferedReader obyekti read() metodunu InputStreamReader obyektində çağıracaq
  2. InputStreamReader obyekti read() metodunu FileInputStream obyektində çağıracaq
  3. FileInputStream obyekti fayldan məlumat oxumağa başlayacaq

Başqa sözlə, zəncirdə məlumatların hərəkəti yoxdur, nə vaxt ki, biz read() və ya readLine() kimi metodları çağırmağa başlamırıq. Axınların özləri məlumatları saxlamır, sadəcə digər mənbələrdən oxuyur.

Kolleksiyalar və Axınlar

Java 8-dən başlayaraq, kolleksiyalar (və yalnız onlardan deyil) üçün məlumat oxuma axını əldə etmək imkanı yarandı. Amma bu, ən maraqlı deyil. Əslində, mürəkkəb məlumat axını zəncirlərini asanlıqla və sadəcə qurmaq imkanı ortaya çıxdı. Əvvəllər 5-10 sətir tələb edən kodu indi 1-2 sətirə yazmaq mümkün oldu.

Bir nümunə — sətir siyahısında maksimum uzunluqda olan sətiri tapmaq:

Maksimum uzunluqda sətirin axtarışı
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necəsən", "işlər necə?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necəsən", "işlər necə?");
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-də axınların genişləndirilmiş dəstəyi Stream<T> interfeysi ilə reallaşdırılıb. Burada T — axında ötürülən məlumatların tipini göstərən tip-parametrdir. Başqa sözlə desək, axın ötürdüyü məlumatların növündən tamamilə asılı deyil.

Kolleksiyadan obyekt-axın əldə etmək üçün sadəcə onun stream() metodunu çağırmaq kifayət edir. Bu kod təxmini belə görünür:

Stream<Tip> ad = kolleksiya.stream();
Kolleksiyadan axın əldə etmək

Bu zaman kolleksiya axın üçün məlumatların mənbəyi hesab olunur, Stream<Tip> tipli obyekt isə məlumatları məhz məlumat axını formasında kolleksiyadan almaq üçün alət rolunu oynayır.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necəsən", "nələr var?");
Stream<String> stream = list.stream();

Bu arada, yalnız kolleksiyadan deyil, həmçinin massivdən də axın əldə etmək olar. Bunun üçün Arrays.stream(); metodundan istifadə etməliyik. Məsələn:

Stream<Tip> ad = Arrays.stream(massiv);
Massivdən axın əldə etmək

Bu halda massiv axın üçün ad adlı məlumat mənbəyi hesab olunur.

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

Stream<Tip> obyektini yaratdıqdan sonra məlumatların hərəkəti baş vermir. Biz sadəcə məlumat axınlarından ibarət zənciri qurmağa başlamaq üçün obyekt-axını əldə edirik.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION