Bildiyimiz kimi java obyekt yönümlü dildir. Amma 8-ci versiyada gələn yeniliklərlə java funksional proqramlaşdırma imkanlarını da özünə əlavə edib. Bunun üçün lambda ifadələrindən (lambda expressions) istifadə olunur. Lambda ifadələrini biz anonim metod kimi də başa düşə bilərik. Yəni real metodlarda olduğu kimi lambda ifadələrinin də parametr listi və gövdəsi olur, yeganə fərqi odur ki, adı olmur. Biz lambda ifadəsini metoda parametr olaraq da göndərə bilərik. Lambda ifadələrinə qısaca lambdas deyilir.
OCA imtahanında ancaq sadə lambda ifadələri soruşulur, məqsəd lambda ilə bağlı əsas anlayışları və sintaksisi mənimsətməkdir. Əsas lambda sualları çox güman OCP imtahanında soruşulacaq.
Lambda Example
Lambda ifadələrinin nə qədər faydalı ola biləcəyini görmək üçün ənənəvi qayda ilə yazılmış bir nümunəyə baxaq və sonra həmin nümunədə müvafiq kod nümunələrini lambda ifadələri ilə əvəz edərək müqayisə aparaq. Görək lambda ifadələri nə dərəcədə faydalıdır.
public class Animal { private String name; private boolean canHop; private boolean canSwim; public Animal(String speciesName, boolean hopper, boolean swimmer) { name = speciesName; canHop = hopper; canSwim = swimmer; } public boolean canHop() { return canHop; } public boolean canSwim() { return canSwim; } public String toString() { return name; } // P.S. }
public interface Checker { boolean test(Animal a); }
public class CheckIfHopper implements Checker { @Override public boolean test(Animal a) { return a.canHop(); } }
public class TraditionalSearch { public static void main(String[] args) { List<Animal> animals = new ArrayList<>(); animals.add(new Animal("fish", false, true)); animals.add(new Animal("kangaroo", true, false)); animals.add(new Animal("rabbit", true, false)); animals.add(new Animal("turtle", false, true)); animals.add(new Animal("frog", true, true)); print(animals, new CheckIfHopper()); } private static void print(List<Animal> animals, Checker checker) { for (Animal animal: animals) if (checker.test(animal)) System.out.println(animal); } }
Output:
kangaroo rabbit frog
P.S. toString()
metodu ovverride olunduğuna görə biz animal
`ı print edəndə toString
metodundan geri döndürdüyümüz dəyər print olunur.
Yuxarıdakı kodun gördüyü iş qısaca ondan ibarətdir ki, bizdə heyvanların listi var və biz bilmək istəyirik ki, bu heyvanlardan hansılar hoppanmağı bacarır. print()
metodu bizim təyin etdiyimiz şərtə uyğun olaraq hoppanmağı bacaran heyvanların siyahısını bizə göstərir. Bəs biz əgər üzməyi bacaran heyvanların siyahısını görmək istəsək nə baş verəcək? Təəssüf ki, bunun üçün bizə başqa class lazım olacaq, CheckIfSwims
classı yaratmalıyıq. Classı yaratdıqdan sonra isə nəticəni görmək üçün yenidən print()
metodunu çağırmalıyıq, bu dəfə isə parametr olaraq new CheckIfSwims()
göndərməliyik, yəni yeni obyekt yaradılır. Başqa bir yoxlama üçün artıq əlavə olaraq 2 iş gördük. Bu əlavə işlərdən bizi lambdas xilas edir. Lambdas ilə yazdıqda TraditionalSearch
classında sadəcə 14-cü sətir aşağıdakı sətirlə əvəz olunur:
14: print(animals, a -> a.canHop());
və ya
14: print(animals, (Animal a) -> { return a.canHop(); } );
Kodu lambdas ilə əvəz etdiyimizə görə artıq bizə CheckIfHopper
classı lazım olmayacaq. Plyus əgər biz üzməyi bacaran heyvanları seçmək istəsək əlavə class yaratmağa ehtiyac qalmayacaq, bir sətirlə biz bunu edə bilərik:
print(animals, a -> a.canSwim());
və ya üzməyi bacarmayanlar:
print(animals, a -> ! a.canSwim());
Biz burada sadəcə 2 davranışı göstərdik, təsəvvür edin sizdən yalnız hoppanmaq və üzmək deyil, bir neçə xüsusiyyət üzrə filter etmək tələb olunur. Bu zaman lamdas-ın önəmi daha çox nəzərə çarpacaq. Növbəti məqalədə Lambda`nın sintaksisinə nəzər salacağıq.
[topics lang=az]