Sobes.tech
Middle

Java'da lambda ifadeleri nedir ve hangi imkanları sağlarlar?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da lambda ifadeleri, isimsiz fonksiyonlar (isimsiz metodlar) oluşturmak için kısa bir sözdizimidir ve argüman olarak geçirilebilir veya değişkenlerde saklanabilirler. Temelde, "anlık" olarak uygulanmış fonksiyonel arayüzlerdir.

Lambda ifadelerinin sağladığı temel özellikler:

  • Sözdizimi basitleştirme: Anonim iç sınıflara kıyasla fonksiyonel arayüzlerle çalışırken boilerplate kodu önemli ölçüde azaltır.

    // Lambda öncesi:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Klasik Runnable");
        }
    };
    
    // Lambda ile:
    Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable");
    
  • Fonksiyonel programlama: Fonksiyonların birinci sınıf vatandaşlar olduğu ve veriler gibi geçirilebildiği daha fonksiyonel kod yazmaya olanak tanır. Bu, Stream API ile çalışmak için anahtar bir unsurdur.

    // Lambda kullanarak liste filtreleme
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Stream API ile çalışma: Lambda ifadeleri, (filter, map, forEach, reduce vb.) Stream API'deki çoğu işlemin temelidir ve özlü ve paralel yürütme sağlar.

    // Akışın elemanlarını dönüştürme ve yazdırma
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // haritalama için lambda
           .forEach(System.out::println); // metod referansı (lambda alternatifi)
    
  • Okunabilirliği artırma: Basit işlemler için lambdalar, kodu daha okunabilir ve anlaşılır kılar, odak noktası işlemin kendisine kayar, anonim sınıf sözdizimine değil.

  • Fonksiyonel arayüzlerin uygulanması: Her yerde kullanılabilir, burada beklenen bir fonksiyonel arayüz örneği (tek soyut metoda sahip arayüz) olmalıdır.

Lambda ifadesinin sözdizimi: (parametreler) -> { gövde }

Örnekler:

  • Parametresiz, dönüşsüz: () -> System.out.println("Merhaba")
  • Bir parametreli, dönüşsüz: name -> System.out.println("Merhaba, " + name) (tek parametre etrafındaki parantezler kaldırılabilir)
  • Birkaç parametreli, dönüşsüz: (x, y) -> System.out.println(x + y)
  • Parametreli, dönüşümlü: (a, b) -> a + b (gövde tek bir ifadeden oluşursa, değeri otomatik olarak döndürülür)
  • Parametreli, blok kod ve dönüşümlü: (a, b) -> { int sum = a + b; return sum; } (dışında return açıkça belirtilmelidir)