Destek Online
Ana içeriğe geç

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 GenixNode üzerinde Java ortamında test edebilir, kodlarınızı anında çalıştırabilirsiniz.