CodeGym /Kurslar /Java SELF AZ /Funksional Metod

Funksional Metod

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

1. Funksional metodlar

Əgər interfeysdə yalnız bir metod varsa, bu tip interfeys dəyişəninə lambda ifadəsi (lambda-funksiyası) ilə təyin olunan bir dəyər verilə bilər. Bu tip interfeyslər funksional interfeyslər adını aldı (Java-da lambda-funksiyalarının dəstəyi əlavə edildikdən sonra).

Məsələn, Java-da Consumer<Tip> (Consumer == İstehlakçı) adlı bir interfeys var, hansı ki accept(Tip obj) metodunu ehtiva edir. Bəs bu interfeysin nə faydası var?

Java 8-də kolleksiyalara forEach() adlı bir metod əlavə edildi ki, bu hər bir element kolleksiyada hansısa bir əməliyyat yerinə yetirmək üçün istifadə oluna bilsin. Məhz bu əməliyyat forEach() metoduna ötürülərkən funksional interfeys Consumer<T> istifadə olunur.

Məsələn, bütün elementləri ekrana çıxarmaq üçün kod belə yazıla bilər:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Salam", "necəsən", "nə xəbər?");

list.forEach( (s) -> System.out.println(s) );
Kolleksiyadakı bütün elementlərin çıxışı (lambda ifadəsi ilə)

Kompilyator bu kodu bu şəkildə çevrilir:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Salam", "necəsən", "nə xəbər?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s);
   }
});
Kolleksiyadakı bütün elementlərin çıxışı (anonim siniflə yazılmış forma)

Birinci yazılış bir mənalı olaraq daha qısadır, nəinki ikinci. Lambda ifadələri ilə kodu oxumaq çətin olsa da, anonim daxili siniflərlə kodu oxumaq bəzən daha çətin olur.



2. Metoda istinad

Ancaq bizim lambda ifadəsi ilə olan kodumuz daha qısa yazıla bilər.

Birincisi, parametrin ətrafında sulu mötərizələri buraxmaq olar s:

list.forEach( (s) -> System.out.println(s) );
Belə idi
list.forEach( s -> System.out.println(s) );
Belə oldu

Bunu yalnız parametr bir dənədirsə etmək olar. Əgər parametrlər bir neçədirsə, mötərizələrdən istifadə etmək lazımdır.

İkincisi isə, belə yazmaq olar:

list.forEach( System.out::println );
Ən kompakt yazılış

Bunların hamısı eyni yazılışdır. Diqqət yetirin ki, println sonra mötərizələr yoxdur.

Burada eyni kod yazılıb — metodun çağırılması:

obraz::metod
x -> obraz.metod(x)

Özünüz düşünün: biz kolleksiyanın list hər bir elementi üçün hansısa bir əməliyyatı yerinə yetirmək istəyirdik. Əgər bu əməliyyat bir funksiyanın çağırılmasıdırsa (məsələn, println() kimi), bu funksiyanı metodu parametr kimi ötürmək daha məntiqli olardı.

Bəs kompilyatora izah etmək üçün ki, funksiya ötürülməlidir, çağırılmamalıdır? Bunun üçün metod adından əvvəl nöqtə yox, iki qoşa nöqtə qoyuruq: çünki bir nöqtə artıq ternar operatorunda istifadə olunur.

Bu ən sadə və kompakt yazılışdır.



3. Konstruktor

İki nöqtə (::) vasitəsilə metodlara linklərdən istifadə etmək çox rahatdır, xüsusən də biz giriş-çıxış axınları ilə işləyəcəyik. Bunu bir az sonra özünüz görəcəksiniz.

Hələlik isə metodlara link ötürməyin 3 məşhur üsulundan danışaq:

Obyektin metoduna link

Obyektin metoduna link ötürmək üçün aşağıdakı kimi kod yazılmalıdır obyekt::metod.
Bu kod, aşağıdakı koda ekvivalentdir: x -> obyekt.metod(x).

Obyekt kimi xüsusi dəyişənlər də istifadə edilə bilər, məsələn thissuper.

Sinifin metoduna link

Statik metoda link ötürmək üçün aşağıdakı kimi kod yazılmalıdır sinif::metod. Bu kod aşağıdakı koda çevriləcək: x -> sinif.metod(x);

Konstruktora link

Konstruktorun davranışı sinfin statik metoduna bənzəyir, buna görə də ona da link ötürmək olar. Bu, aşağıdaki şəkildə görünür: sinif::new.

Məsələn, kolleksiyalarda növ silməsini keçmək və toArray() metoduna yeni massiv yaradacaq konstruktora link ötürmək olar: toArray( int[]::new );


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