Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

0
Java'da Lambda Expression ve Anonymous class arasındaki fark nedir?

Açık 1 Cevaplar 33 Gösterim Java
Lambda Expression ve Anonymous class arasındaki fark nedir?

Lamda epression anonim bir fonksiyon diye biliyorum. Yani Anonim bir functional interface class'ı Hatta @FunctionalInterface kullanılıyor,.
1Yorumlar
(4.8k puan)
Güzel. Bak hiç düşünmemiştim bu konuda. İyi soru olmuş.

1 cevap

0

Olayı birkaç açıdan düşünelim. Anoymous sınıflar java'da herhalde ilk versiyonlardan bu yana var. Lambda 1.8 yeni adıyla 8. versiyondan sonra eklendi. Anonymous sınıf yazmakla lambda yazmanın farkı; lambda yazmak kod yazmayı biraz azaltıyor, kolaylaştırıyor. Aynı örneği bir anonymous bir de lambda ile yazalım.

Önce anonymous sınıf.

package ornek;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class AnonymousClassExample {
	public static void main(String[] args) {
		List<Double> list = new ArrayList<>();
		for (int i = 0 ; i < 100 ; i++) {
			list.add(Math.random());
		}
		
		list.forEach(new Consumer<Double>() {
			@Override
			public void accept(Double t) {
				System.out.println(t);
			}
		});
	}
}

Bu sınıfı yazıp sınıfımızı derlersek bize aşağıdaki gibi iki tane class dosyası oluşturuyor.

İlki AnonymousClassExample.class diğeri ise AnonymousClassExample$1.class Bunu zaten daha önceden biliyorduk. Java sınıfları derlerken eğer sınıf içinde bir anonymous sınıf varsa bunu ayrı bir sınıf olarak çıkarıyor. Beni şaşırtan kısım aşağıdaki kodun sonunda oldu.

package ornek;

import java.util.ArrayList;
import java.util.List;

public class Lambda {
	public static void main(String[] args) {
		List<Double> list = new ArrayList<>();
		for (int i = 0 ; i < 100 ; i++) {
			list.add(Math.random());
		}
		
		list.forEach(e-> System.out.println(e));
		list.stream().forEach(e->System.out.println(e));
	}
}


Burada ise aynı kodu hem direk aynı metod ile hem de stream üzerinden lambda kullanarak denedim. Önceki görselde göreceğiniz üzere Lambda.class dosyası çıktı. Başka bir dosya oluşturmadı.

Kodları decompile ettiğim zaman aynen geri çıktı.

Sonuç olarak lambda yazdığımız zaman başka bir sınıf oluşturmadan derleyici/yorumlayıcı düzeyinde konu normal kod gibi devam ediyor.

AnonymousClass yazdığımız zaman ise bu başka bir sınıf gibi algılanıp derleniyor. Proje derleme aşamasında birbirine bağlanıyor.

Lambda fonksiyonlarında şunu hatırlıyorum; collection için stream kullanıyorsan map, foreach, filter gibi fonksiyonlar üzerinde performans iyileştirmeleri var. For kullanmakdan daha performanslı olduğunu iddia ediyorlar.

 

önce (4.8k puan)