ProgramlamaJava Geliştirici

Java'da lambda ifadelerinin ve fonksiyonel arayüzlerin nasıl çalıştığını açıklayın. Yanlış kullanımlarıyla hangi hatalar ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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));

Kandırmaca Sorusu

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.

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


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ı @FunctionalInterface ile 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.