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) );
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);
}
});
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) );
list.forEach( s -> System.out.println(s) );
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 );
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 this
və super
.
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 );
GO TO FULL VERSION