Merhaba, değerli Jetto Net forumu takipçileri!
Java nesne yönelimli programlama (OOP) serimize devam ediyoruz. Bir önceki yazıda sizlere, Java'nın verileri saklama, düzenleme ve yönetmesi için sunduğu güçlü bir araç olan Collections Framework'ü incelemiştik. Bu yazıda ise Java 8 ile gelen ve kodları daha okunaklı ve fonksiyonel bir hale getiren Lambda ifadelerini ve fonksiyonel arayüzleri inceleyeceğiz.
Lambda İfadeleri (Lambda Expressions) Nedir?
Lambda ifadeleri, Java'da metotları ifade etmenin kısa ve öz yöntemidir. Lambda ifadeleri, isimsiz fonksiyonlar olarak da bilinmektedir çünkü bir isme sahip olmak zorunda değiller. Bu ifadeler, genellikle tek bir amaca yönelik küçük kod bloklarını temsil etmektedir. Genel yapısı şu şekilde olmaktadır:
(parametre listesi) -> { ifade veya kod bloğu }
Örnek olarak, toplama işlemi yapan bir lambda ifadesi yazalım:
- Yukaridaki örnekte, lambda ifadesi iki tamsayı parametresi almaktadır. (int a, int b): Lambda ifadesinin parametre listesidir.
- ->: Lambda operatörüdür. Parametre listesini ifade veya kod bloğundan ayırır.
- { return a + b; }: Lambda ifadesinin gövdesidir. Yukardaki örnekte, lambda ifadesi iki parametreyi toplayıp sonucu döndürmektedir.
Fonksiyonel Arayüzler (Functional Interfaces) Nedir?
Fonksiyonel arayüzler, sadece bir tane abstract (soyut) metodu olan arayüzlerdir. Lambda ifadeleri, fonksiyonel arayüzlerin soyut metotlarını uygulamak için kullanılır. Bu sayede, lambda ifadeleri fonksiyonel arayüzler aracılığıyla kullanılabilir hale gelir.
Java 8 ile birlikte java.util.function paketinde birçok hazır fonksiyonel arayüz eklenmiştir. En sık kullanılan fonksiyonel arayüzlerden bazıları şunlardır:
- Predicate<T>: Bir T türündeki nesneyi alır ve boolean bir değer döndürür.
- Consumer<T>: Bir T türündeki nesneyi alır ve herhangi bir değer döndürmez.
- Function<T, R>: Bir T türündeki nesneyi alır ve R türünde bir nesne döndürür.
- Supplier<T>: Herhangi bir parametre almaz ve T türünde bir nesne döndürür.
Lambda İfadeleri ve Metot Referansları
Lambda ifadeleri yerine, mevcut bir metodu referans göstererek de aynı işlevi yerine getirebiliriz. Bu yönteme metot referansı diyoruz. Metot referansları, kodun daha da okunabilir olmasını sağlar.
// Lambda ifadesi
list.forEach(x -> System.out.println(x));
// Metot referansı
list.forEach(System.out::println);
Stream API ile Koleksiyonlar Üzerinde Fonksiyonel İşlemler
Java 8 ile birlikte gelen Stream API, koleksiyonlar üzerinde fonksiyonel işlemler yapmamızı sağlar. Lambda ifadeleri ve metot referansları, Stream API ile birlikte kullanılarak koleksiyonları filtreleme, sıralama, dönüştürme gibi işlemleri daha kolay ve okunabilir bir şekilde yapmamıza olanak tanır.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers .stream()
.filter(x -> x % 2 == 0)
.collect(Collectors.toList());
Yukardaki örnekte, bir tamsayı listesini filtreleyerek sadece çift sayıları içeren yeni bir liste oluşturduk.
Sonuç
Lambda ifadeleri ve fonksiyonel arayüzler, Java'ya fonksiyonel programlamanın gücünü getiren önemli özelliklerdir. Bu özellikleri kullanarak kodumuzu daha okunaklı, özlü ve esnek hale getirebiliriz.
Bir sonraki yazımızda, OOP'nin diğer önemli kavramlarını incelemeye devam edeceğiz. Yorumlar kısmında sorularınızı veya görüşlerinizi yazabilirsiniz.
İyi Kodlamalar!