Bir koleksiyon nesnesi üzerinde yinelemek istediğimi varsayalım.Lambda İfadeleri ve Anonim Sınıflar arasındaki uygulama farklılıkları/en iyileştirmeler
List<String> strmap = ...
//Without lambdas
strmap.stream().filter(new Predicate<String>() {
public boolean test(String string) {
return string.length == 10;
}
}.forEach(new Consumer<String>() {
public void accept (String string) {
System.out.println("string " + string + " contains exactly 10 characters");
}
}
//With lambdas
strmap.stream()
.filter(s -> s.length == 10)
.forEach(s -> System.out.println("string " + s + " contains exactly 10 characters");
İkinci örnek (lambdas olmadan) nasıl çalışır? Kodu çağırdığım her seferde yeni bir nesne (Predicate and Consumer) oluşturuldu, java jit derleyicisi lambda ifadesini ne kadar ideal hale getirebilir? Daha iyi bir performans için tüm lambdaları bir değişken olarak ilan etmeli ve her zaman sadece bir referans mı vermeliyim?
private Predicate<String> length10 = s -> s.length == 10;
private Consumer<String> printer = s -> { "string " + s + " contains exactly 10 characters"; }
strmap.stream()
.filter(length10)
.forEach(printer);
Bkz. (Burada) (http://stackoverflow.com/q/27524445/2711488). Ve [this] (http://stackoverflow.com/a/23991339/2711488) lambda ifadeleri ve yöntem referansları için de geçerlidir. HotSpot, iç sınıfların geçici örneklerini en iyi duruma getirebilir, ancak vatansız lambda ifadeleri için ilk etapta geçici örnekler yoktur. – Holger
@Holger - güzel yanıtlar – ZhongYu