Java 8 – Lambda İfadeleri ve Fonksiyonel Arayüzler
Merhaba arkadaşlar;
Bugün sizlerle fonksiyonel arayüzlerden (Functional Interfaces) ve Lambda ifadeleri (Lambda Expressions) ile olan ilişkisinden basetmek istiyorum.
Functional Interfaces
Tek bir soyut metodu bulunan arayüzlere fonksiyonel arayüz denir. İki veya üç değil, yalnızca bir tane soyut metodu olmalı. Peki neden “1” dersek sebebinin Lambda ifadelerine dayandığını söylemek isterim.
Örneğin;
Şöyle bir Lambda ifademiz olsun;
fn(x,y) -> 2*x + y
Bu Labmda deyimini örneğin Javascript gibi bir dil ile temsil etmek isteseydik şöyle yazabilirdik;
function(x , y) {
return 2*x+y;
}
Peki fn(x,y) -> 2*x + y Lambda ifadesini Java programlama dilinde nasıl yazabiliriz?
Java 8 geliştirilirken, geliştirim takımı kendilerine bu soruyu sormuş ve yanıt olarak fonksiyonel arayüzler kullanarak ihtiyacı karşılamışlar.
Şöyle ki; Bir Lambda ifadesi, Java derleyicisi tarafından, bir Java arayüzünün (tek bir soyut metodu olmalı) nesnel karşılığına (implementation) dönüştürülmektedir.
Örneğin, fn(x,y) -> 2*x + y Lambda ifadesi, aşağıdaki fonksiyonel arayüze dönüştürülebilirdir. Çünkü fonksiyon x ve y adında iki parametre almakta ve 2*x + y ile tek bir değer döndürmektedir. Tabi burada x ve y’ nin tipleri ne? dersek, herhangi bir matematiksel tip olabilir. Biz burada sabit bir tip (int gibi) verebilir, veya jenerik tiplemeler de yapabiliriz. Fakat şu anlık bununla yetinelim.
@FunctionalInterface // Opsiyonel
interface Foo{
int apply(int x, int y);
}
Şimdi bu Lamda ifadesini uygulamamızda kullanalım.
Örnek 1:
Lambda ifadeleri atama sırasında kullanılabilir.
Foo foo = (x,y) -> (2*x+y);
int sonuc = foo.apply(3,4);
System.out.println("Sonuç: "+sonuc); // Çıktı: 10
// veya
Foo foo = (x, y) -> Math.pow(x,y);
int sonuc = foo.apply(3,2);
System.out.println("Sonuç: "+sonuc); // Çıktı: 3*3 = 9
Örnek 2:
Lambda ifadeleri, metod parametrelerinde de tanımlanabilir.
class Bar{
public int calculate(Foo foo, int x, int y){
return foo.apply(x,y);
}
}
Bar bar = new Bar();
int sonuc = bar.calculate( (x,y) -> (2*x+y) , 3, 4 );
System.out.println("Sonuç: "+sonuc); // Çıktı: 10
Java programlama dilinde fonksiyon ifadesi pek kullanılmaz, onun yerine metod ifadesi kullanılır. Java metodları tek başına birer eleman değildir, diğer bir dil elemanının (sınıf, enum, interface ..) dahilinde tanımlanırlar. Javascript gibi dillerde ise fonksiyonlar tek başına birer elemandır, diğer bir dil elemanının içinde olmak zorunluluğu yoktur. Bu sebeple Java ortamında, bir Lambda ifadesinden bir fonksiyona/metoda/iş birimine dönüşüm için fonksiyonel arayüzler kullanılmaktadır.
Tekrar görüşmek dileğiyle..
1 Comment
Harika bir anlatım, kısa ve öz. Java Tutorials’ta Lambda Expressions bölümü kafamı epey kurcalamıştı ama bu yazıyla meselenin özünü daha iyi kavramış oldum. Teşekkürler.