Java Lambda Nedir Nasıl Kullanılır?

1229 kez okundu.

Java 8 ile hayatımıza giren lambda kavramı fonksiyonel programlamaya atılan bir adımdır. Lambda ifadelerini, herhangi bir sınıfa ait olmaksızın oluşturulabilen metotlar olarak düşünebiliriz.

Lambda ifadelerini açıklamadan önce bazı kavramları bilmemiz gerekiyor. Bunlardan ilki Functional Interface kavramıdır. Java dokümantasyonuna göre functional interface sadece 1 tane soyut metoda sahip olan interface’tir.

Java’da bir interface’in sadece 1 metot bulunduracağını önceden bildirebilirsiniz. Bunun için @FunctionalInterface annotation’ı kullanılır. @FunctionalInterface annotation’ı ile bildirdiğiniz bir interface’e sadece 1 adet soyut metot koyabilirsiniz. Eğer birden fazla metot eklersek derleme hatası alırız. Bir örnek yapalım.

compile error

Lambda ifadelerini de sadece functional interface’lerle kullanabiliriz. Yani lambda ifadelerinin kaynak aldığı interface, sadece 1 adet soyut metoda sahip olmalıdır. Lamda ifadeleri 1’den fazla metodu impement edebilecek bir yapıda değildir.  Eğer interface’iniz 1’den fazla metoda sahipse anonymous inner class kullanmak yararınıza olacaktır.

Önceden bilmenizi tavsiye ettiğim diğer konu ise anonymous inner class’lardır. Bunun için http://www.javadunyasi.com/anonymous-inner-class/ linkinde yer alan yazıyı okuyabilirsiniz. Lambda ifadelerine aslında bu kavramlardan sonra ihtiyaç duyulmuştur.

Şimdi bir örnek yapalım sonra kodları açıklayalım.

@FunctionalInterface
interface DenemeInterface {
	public String denemeMetot(String s1, String s2);
}
 
public class Test {
 
	public static void main(String[] args) {
 
		DenemeInterface d1 = new DenemeInterface() {
 
			public String denemeMetot(String s1, String s2) {
					return s1+  " " + s2;
			}
		}; 
 
		System.out.println(d1.denemeMetot("Anonymous Inner", "Class"));
 
		DenemeInterface d2 = (String s1, String s2) -> {
 
			return s1+  " " + s2;
		};
 
		System.out.println(d2.denemeMetot("Lambda", "İfadesi"));
	}
 
}

Yukarıdaki kodda denemeMetot adlı metot ilk önce d1 referansı üzerinden anonymous inner class kullanılarak implement edilmiştir.
Daha sonra ise aynı metot lambda ifadesi kullanılarak d2 referansı üzerinden implement edilmiştir. Lambda ifadesi kullanılan satırı inceleyelim.

1
2
3
DenemeInterface d2 = (String s1, String s2) -> {			
	return s1+  " " + s2;
};

Lambda ifadeleri iki bölümden oluşur. Bu bölümler -> operatörünün sağ ve sol tarafındadır. Sol taraf parametre listesi sağ taraf lambda ifadesinin gövdesidir.

Bir lambda ifadesinin bir interface’teki metotla eşleşmesi için 3 şartın sağlanması gerekir. Bunlar:

  1.  interface sadece 1 soyut metoda sahip olmalıdır. Yani Functional Interface olmalıdır.
  2.  Lambda ifadesinde bulunan parametre listesi interface’te bulunan metodun parametre listesiyle aynı olmalıdır.
  3.  Lambda ifadesinde bulunan geri dönüş değerinin tipi interface’te bulunan metodun geri dönüş tipiyle aynı olmalıdır.

Kodları incelemeye devam edersek;

System.out.println(d2.denemeMetot("Lambda", "İfadesi"));

Satırında ise lambda ifadesi ile implement edilen denemeMetot adlı metot d2 referansı üzerinden çağrılmaktadır.

Parametresiz Metot

Interface’te bulunan metot herhangi bir parametre almadıysa ve herhangi bir değer döndürmüyorsa lambda ifadesi aşağıdaki gibi olur.

@FunctionalInterface
interface DenemeInterface {
	public void denemeMetot();
}
 
public class Test {
 
	public static void main(String[] args) {
 
		DenemeInterface d2 = () -> System.out.println("Lambda İfadesi");
 
		d2.denemeMetot();
	}	
}

Tek Parametreli Metot

Interface’te bulunan metot, 1 tane parametre alıyorsa ve herhangi bir değer döndürmüyorsa lambda ifadesini aşağıdaki gibi yazabiliriz.

@FunctionalInterface
interface DenemeInterface {
	public void denemeMetot(String s1);
}
 
public class Test {
 
	public static void main(String[] args) {
 
		DenemeInterface d2 = (String s1) -> System.out.println(s1);
 
		d2.denemeMetot("Tek Parametreli");
	}	
}

Tek parametreli bir metot için lambda ifadesi yazıyorsanız parametrenin tipini ve parantezleri yazmak zorunlu değildir.

DenemeInterface d2 = e -> System.out.println(e);

Birden Fazla Parametre Alan Metot

Interface’te bulunan metot, 1’den fazla parametre alıyorsa ve herhangi bir değer döndürmüyorsa lambda ifadesini aşağıdaki gibi yazabiliriz. Tek parametreli metot gibi birden fazla yazımı yoktur. Parantezler kullanılır.

@FunctionalInterface
interface DenemeInterface {
	public void denemeMetot(String s1, String s2);
}
 
 
public class Test {
 
	public static void main(String[] args) {
 
		DenemeInterface d2 = (s1, s2) -> System.out.println(s1 + " " + s2);
 
		d2.denemeMetot("Birden Fazla", "Parametreli Metot");
	}	
}

Parametre alan metotlar için lambda ifadeleri yazılırken -> operatörünün sol tarafına parametreleri yazarken parametrelerin tipi de yazılabilir. Fakat zorunlu değildir. Üstteki örneği aşağıdaki şekilde de yazabiliriz.

DenemeInterface d2 = (String s1, String s2) -> System.out.println(s1 + " " + s2);

You may also like...

Yorum Yazın

avatar
  Subscribe  
Notify of