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:
- OOP, irsiyyət və interfeyslər (Java Core 1-2 səviyyə kvestləri).
- Interfeys metodlarının defolt implementasiyası.
- Daxili və anonim 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 InputStreamReader
və BufferedReader
.
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:
BufferedReader
obyektiread()
metodunuInputStreamReader
obyektində çağıracaqInputStreamReader
obyektiread()
metodunuFileInputStream
obyektində çağıracaqFileInputStream
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ışı |
---|
|
|
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();
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);
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.
GO TO FULL VERSION