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.