Modül dersleri (1/2)
Lambda İfadeleri
Java 8'den itibaren işlevsel programlama Lambda İfadeleri aracılığıyla desteklenmektedir. Bir lambda ifadesi esas olarak yöntemlere argüman olarak aktarılabilen veya değişkenlerde saklanabilen anonim bir yöntemdir (isimsiz bir işlev).
Fonksiyonel Arayüzler
Lambda ifadesi yalnızca İşlevsel Arayüzün gerekli olduğu durumlarda kullanılabilir. İşlevsel bir arayüz, tam olarak bir soyut yöntem bildiren bir arayüzdür. Java bu arayüzleri isteğe bağlı @FunctionalInterface ek açıklamasıyla işaretler.
Kullanıcı tanımlı işlevsel arayüz örneği:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}Java 8'den önce anonim bir iç sınıf tanımlamanız gerekiyordu. Lambda'larla sözdizimi şu şekilde basitleştirilmiştir:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Lambda İfadelerinin Yapısı
Bir lambdanın temel sözdizimi şöyledir:
(parameters) -> { body }
- Parametreler olmadan:
() -> System.out.println("Hello") - Tek parametre:
x -> x * 2(parantez kullanılmayabilir) - Birden fazla parametre:
(x, y) -> x + y - Çok satırlı gövde: Gövde birden fazla ifade içeriyorsa,
{}parantezleri ve açık birreturnifadesi gereklidir.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};Java'da Standart İşlevsel Arayüzler
java.util.function paketi çeşitli yerleşik işlevsel arayüzler sağlar:
Predicate<T>:Ttüründe bir bağımsız değişkeni kabul eder ve bir boole değeri döndürür (test(T t)yöntemi).Consumer<T>:Ttüründe bir bağımsız değişkeni kabul eder ve sonuç döndürmeden bir işlem gerçekleştirir (accept(T t)yöntemi).Function<T, R>:Tbağımsız değişkenini kabul eder veR(apply(T t)yöntemi) sonucunu döndürür.Supplier<T>: hiçbir argümanı kabul etmez veT(get()yöntemi) türünde bir değer döndürür.
Kendin dene
İki tam sayıyı toplayan bir lambda ifadesi kullanarak Hesap Makinesi arayüzünü başlatarak kodu tamamlayın. Daha sonra 5 ve 3'ü geçerek hesaplama yöntemini çağırın ve sonucu yazdırın.
İpucu göster
'Hesap Makinesi toplayıcı = (a, b) -> a + b;' komutunu bildirin ve ardından yazdırma çağrısında 'adder.calculate(5, 3)' komutunu çağırın.
3 denemeden sonra çözüm mevcut
Dize uzunluğunun 5 karakterden büyük olup olmadığını kontrol eden bir lambda ifadesi kullanarak isLong adlı standart işlevsel arabirimin Predicate<String> örneğini oluşturun. Daha sonra 'merhaba dünya' için test sonucunu yazdırın.
İpucu göster
Bir `Predicate<String>` için lambda, `s` parametresini alır ve bir boole koşulu olarak `s.length() > 5` değerini döndürür.
3 denemeden sonra çözüm mevcut
Üzerinde sort() yöntemini çağırarak ve Karşılaştırıcıyı uygulayan bir lambda ifadesi ileterek (iki s1, s2 dizesini alıp bunları CompareTo kullanarak karşılaştırarak) dize adları listesini alfabetik olarak sıralayın.
İpucu göster
Listeyi yerinde sıralamak için `names.sort((s1, s2) -> s1.compareTo(s2));' komutunu kullanın.
3 denemeden sonra çözüm mevcut