Ali Kayadibi
Yazılım Geliştirme Uzmanı

Java 17: Lambda Expression

Java 17: Lambda Expression

Neden Lambda Expressionları kullanırız?

  • Fonksiyonel programlamayı kullanmamızı sağlar.
  • Okunabilir ve kısa kodlar yazmamızı sağlar.
  • Daha kolay ve kullanışlı APIlar ve kütüphaneler yazmamıza yardımcı olur.
  • Pararel işleme için destek sunar.

Fonksiyonel programlama neden ihtiyaç duyuyoruz?

  • Daha okunabilir, daha kolay yönetilebilir, daha iyi kod yazmak için fonksiyonel programlama kullanabiliriz.
  • Objeler ve classlarla uğraşmadan içinde bulunduğumuz duruma özel fonksiyonlar yazabilmemize yarar.
  • Object oriented programmingde her şey birer objedir. Tüm yazdığımz kod blokları classlar ve objeler ile ilişkilidir.

Lambda Expressionlar bize nasıl yardımcı oluyor?

  • Lambdalar bize fonksiyon olan bu tür entityleri oluşturmamızı sağlar, lambdalar herhangi bir classa ait olmayan fonksiyonlardır, ve bu fonksiyonlar javadaki value yerine kullanılabilir.
  • Bu tür lambda kod parçalarını javada kullanabiliceğimiz değerlere atayabiliriz.
1
2
3
public void selamla(action){ // örnek bir lambda fonksiyonu çalışma prensibi  
    action();                 
  }

Değerlere atanan fonksiyonlar nasıl yazılır?

1
2
3
4
5
6
7
8
9
10
11
12
kodParcasi = public void selamla(){ // şeklinde bir fonksiyon yazıp, bunu kodParcasi değişkenine atayabiliriz.
    System.out.println("Selam!");               
  }

// Public kısmını yazmamıza gerek yok çünkü zaten değişkeni kullanarak çağırıyoruz.
// Değişken ismini kullanarak çağıracağımız için selamla fonksiyon ismini yazmamıza da gerek yok.
// Java 8 ile Java compiler return type'i anlayabilicek kadar akıllı olduğu için artık void kullanmamıza da gerek yok.
// Ek olarak parantez ve kıvırcık parantez arasına -> işaretini koyarsak ilk lambda fonksiyonumuzu yazmış oluruz.

kodParcasi = () -> {
  System.out.println("Selam!");    
}

Bir örnek yapalım.

1
2
3
4
5
6
7
sayininKaresi = public int kare(int a){           Lambda Karşılığı : sayininKaresi = (int a) -> a*a; 
	return a * a;                            
}

ikiSayiToplami = public int toplam(int a, int b){    Lambda Karşılığı : toplam = (int a, int b) -> a+b;
	return a + b;
}

Lambda fonksiyonlarının tipi nedir?

Lambda fonksiyonlarının tipi lambda expression ile aynı signatureye sahip bir inferfacenin ismi olabilir. Yazdığımız lambda fonksiyonu interfacedeki fonksiyon ile örtüşüyorsa o interfacei lambda fonksiyonunun tipi olarak kullanabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;

public class Main {
    public static void main(String[] args) {
  		LambdaOrnek lambdaFonksiyonuOrnek = () -> System.out.println("Örnek"); // lambda fonksiyonuna parametre verirsek ya da 
  																		// interfacede bulunan fonksiyona parametre eklersek 
																		// compiler hata verir.
	}
}

interface LambdaOrnek{
  void ornek();
}

Bir başka örnek:

1
2
3
4
5
6
7
8
9
10
11
import java.util.*;

public class Main {
    public static void main(String[] args) {
      ToplamOrnek toplamOrnekDeneme = (int a, int b) -> a + b;  
  }
}

interface ToplamOrnek{
  int toplamOrnek(int a, int b);
}

**Bu tür kullanılan interfacelerde sadece tek bir metod olabilir. Birden fazla metod olmasına java compiler izin vermeyecektir.**

Obje oluşturup yazmak ile interface tipini kullanmanın arasındaki fark nedir?

İkisi de benzer şekillerde yazıldığı zaman benzer sonuçlar verse de interface kullandığımız zaman, bir obje oluşturmadan interface instancesi kullanarak fonksiyonu kullanmış oluyoruz. Daha az kod kullanarak aynı şeyi yapmış oluyoruz.

Functional Interface

Functional interfacelerde sadece 1 abstract method olmalıdır. Aksi takdirde compiler hata verir. Bu interfaceler lambda fonksiyonlarda kullanılabilir

@FunctionalInterface anatasyonu kullanılabilir(zorunlu değildir java otomatik bu anatosyona göre davranıyor). Java 8de bu tür lambda fonksiyonlarda kullanılması için  Java geliştiricileri özel bir functions package’i oluşturdu. Bu package içerisinde Predicate(predicate of boolean türleri için içerisinde .test bulunan interface), Supplier (supplier of results ) gibi interfaceler bulunmaktadır. Lambda fonksiyonları kullanılıcağı zaman elle oluşturmak yerine bu built in interfaceler kullanılabilir.

Referanslar