Lambda ifadeleri Java 8'de tek metod içeren arayüzlerin (fonksiyonel arayüzler) daha sade bir sözdizimi ile uygulanabilmesi için tanıtılmıştır.
Fonksiyonel arayüz, tam olarak bir tane soyut metoda sahip olan bir arayüzdür. Örnek:
@FunctionalInterface interface MyAction { void perform(String s); }
Lambda ifadesi bu tür bir arayüzü uygulamak için kullanılabilir:
MyAction action = (s) -> System.out.println(s); action.perform("Hello lambda!");
Lambda ifadesi kullanıldığında, derleyici hangi arayüzün uygulandığını otomatik olarak anlar (target typing). Lambdalar genellikle koleksiyonlarla birlikte kullanılır:
List<String> list = Arrays.asList("one", "two", "three"); list.forEach(s -> System.out.println(s));
Soru: Lambda ifadesi, dış sınıfın statik olmayan alanlarına veya metodlarına atıfta bulunabilir mi? Bu konuda herhangi bir kısıtlama var mı?
Cevap: Lambda ifadesi, dış sınıfın alanlarına ve metodlarına atıfta bulunabilir, ancak dış metodun yerel değişkenlerini kullanıyorsa, bu değişkenlerin final veya effectively final (yani ilk atamadan sonra değiştirilmeyen) olması gerekir. Örneğin:
void doIt() { int x = 42; Runnable r = () -> System.out.println(x); // x effectively final olmalıdır }
Eğer x tanımlandıktan sonra değiştirilirse bir derleme hatası oluşur.
Hikaye
Bir metot içinde lambda kullanılırken, dıştaki yerel bir değişken üzerinde değişiklik yapma girişiminde bulunuldu ve "Lambda ifadesinde kullanılan değişken final veya effectively final olmalıdır" hatasıyla karşılaşıldı. Geliştiriciler, bu kısıtlamayı hatırlayana kadar nedeni bulmakta çok zaman harcadı.
Hikaye
Bir projede lambda'lar için kendi arayüzlerimizi kullandık, ancak bunları
@FunctionalInterfaceile işaretlemeyi unuttuk. Sonrasında arayüze ikinci bir metot eklediğimizde proje derlenmemeye başladı. Bu, yakalaması zor olan beklenmedik hatalara yol açtı.
Hikaye
Lambda ifadesi içeren bir alanı olan bir nesneyi serileştirme girişimi, serileştirme/derserileştirme işleminin düzgün çalışmamasına sebep oldu — lambda varsayılan olarak serileştirilmez. Eğer lambda tutarsız bağımlılıklar içeriyorsa, ağ üzerinden aktarım sırasında hatalar oluşabilir.