Skip to main content

☕ Java Lambda İfadeleri (Anonymous Functions) Nasıl Kullanılır?

Java Lambda ifadeleri, yani anonim fonksiyonlar, bir kod bloğunu parametre olarak geçirmenizi sağlar.
Bu sayede daha kısa, temiz ve fonksiyonel tarzda kod yazabilirsiniz.


🧠 Teknik Özet

Ana konu: Java’da Lambda ifadeleri (anonim fonksiyonlar)
Amaç: Gereksiz sınıf tanımlarını azaltarak kodu sadeleştirmek ve okunabilirliği artırmak
Adımlar:

  1. Lambda ifadesi yapısını öğrenme
  2. JShell üzerinde örneklerle deneme
  3. Yerleşik işlevsel arayüzleri (Predicate, Consumer, Function...) uygulama

💡 Lambda ifadeleri, Java’nın fonksiyonel programlama yaklaşımını destekler ve java.util.function paketi ile entegre çalışır.


⚙️ 1. Lambda Yapısını Anlamak

Lambda genel sözdizimi:

(argümanlar) -> { gövde }

Argümanlar: Parantez içinde, tür belirtmeden yazılabilir (Java otomatik algılar).

Ok İşareti (->): Parametreleri kod bloğuna bağlar.

Gövde: Çalıştırılacak kod bloğunu içerir.

💬 JShell kullanarak örnekleri test etmek için terminalde jshell yazın, çıkmak için /exit komutunu kullanın.


🐾 2. Basit Lambda Örneği

Bir liste oluşturalım:


List<String> evcilHayvanlar = Arrays.asList("Köpek", "Kedi");

Her öğeyi ekrana yazdıralım:


evcilHayvanlar.forEach(x -> System.out.println(x));

Aynı kodun sade hali (metot referansı):


evcilHayvanlar.forEach(System.out::println);

💡 System.out::println, x -> System.out.println(x) ifadesinin kısa yazımıdır.


📜 3. Çok Satırlı Lambda Gövdesi

Lambda gövdesi birden fazla satır içeriyorsa kullanılır:


evcilHayvanlar.forEach(x -> {
System.out.println("Adı: " + x);
System.out.println("Sıra No: " + evcilHayvanlar.indexOf(x));
});

Çıktı:


Adı: Köpek
Sıra No: 0
Adı: Kedi
Sıra No: 1

🧩 4. Yerleşik İşlevsel Arayüzler

Java 8 ile gelen java.util.function paketi, sık kullanılan Lambda senaryoları için hazır arayüzler sunar. Bunlar tek metot içerir ve Lambda ifadeleriyle doğrudan uyumludur.

✅ Predicate (Koşul Kontrolü)

Bir koşulu test eder, boolean döner.


Predicate<String> filtreleK = x -> x.startsWith("K");
evcilHayvanlar.stream().filter(filtreleK).forEach(System.out::println);

Çıktı: Köpek, Kedi

📦 Consumer (Değer Tüketimi)

Değeri kullanır ama geri döndürmez (void döner).


Consumer<String> hayvanYazdir = x -> System.out.println(x);
evcilHayvanlar.forEach(hayvanYazdir);

Çıktı: Köpek, Kedi

🔄 Function (Değer Dönüştürme)

Bir değeri başka bir değere dönüştürür.


Function<String, String> buyukHarfYap = x -> x.toUpperCase();
evcilHayvanlar.stream().map(buyukHarfYap).forEach(System.out::println);

Çıktı: KÖPEK, KEDİ

⏰ Supplier (Değer Sağlayıcı)

Parametre almaz, çağrıldığında bir değer üretir.


Supplier<java.time.LocalTime> saatVer = () -> java.time.LocalTime.now();
System.out.println(saatVer.get());

Çıktı: 21:52:38.384278 gibi anlık saat

🔁 UnaryOperator (Tekli İşlem)

Girdi ve çıktı tipi aynıdır, genellikle dönüşümde kullanılır.


UnaryOperator<String> buyukHarf = x -> x.toUpperCase();
System.out.println(buyukHarf.apply("kopek"));

Çıktı: KOPEK

➕ BinaryOperator (İkili İşlem)

İki değeri birleştirir, girdi ve çıktı tipi aynıdır.


BinaryOperator<Integer> toplama = (x, y) -> x + y;
System.out.println(toplama.apply(5, 3));

Çıktı: 8


❓ Sıkça Sorulan Sorular (SSS)

  1. Lambda ifadeleri neden anonimdir?

Çünkü isimleri yoktur. Tek seferlik işlemler için yazılırlar.

  1. Metot referansı (::) ne işe yarar?

Lambda sadece bir metot çağırıyorsa, bu ifade kodu kısaltır: System.out::println.

  1. Tüm arayüzler Lambda olabilir mi?

Hayır. Sadece tek soyut metot içeren işlevsel arayüzler (@FunctionalInterface) olabilir.

  1. Predicate ve Function farkı nedir?

Predicate yalnızca boolean döndürür; Function dönüş tipini serbest bırakır.

  1. Lambda ifadeleri nerelerde kullanılır?

Stream API, olay yönetimi, filtreleme ve veri işleme gibi senaryolarda yaygındır.


🏁 Sonuç

Bu rehberde Java'da Lambda ifadeleri oluşturmayı, metot referanslarını ve java.util.function paketindeki yerleşik arayüzleri (Predicate, Consumer, Function vb.) kullanmayı öğrendiniz.

Artık kodlarınızı daha kısa, okunabilir ve fonksiyonel bir yaklaşımla yazabilirsiniz. 💡 Kendi örneklerinizi Rabisu Bulut üzerinde Java ortamında test edebilir, kodlarınızı anında çalıştırabilirsiniz.