Lambda ifade öbek üzerinde bir nesne her zaman oluşturmak'in idam?
Bir toplama Java8 gibi yeni sözdizimsel şeker kullanarak üzerinde yineleme zaman
myStream.forEach(Item -> {
// do something useful
});
Bu 'eski sözdizimi' parçacığının? eşdeğer değil
myStream.forEach(new Consumer<Item>() {
@Override
public void accept(Item item) {
// do something useful
}
});
Bu Consumer
yeni bir anonim nesne yığını üzerinde her zaman oluşturulur yani ben bir koleksiyon üzerinde yineleme yapar? Ne kadar yığın alanı alır bu? Performans sonuçları nedir? Büyük üzerinde çok seviyeli veri yapıları döngüler yineleme zaman için eski model kullanmam gerektiğini değil anlamına mı geliyor?
CEVAP
Eşdeğer ama aynı değil. Sadece eğer lambda ifade yakalar değerler yoksa olmaz " dediler, yeniden kullanılan her çağırma üzerine bir singleton olacak.
Bu davranış tam olarak belirtilmemiş. JVM bunu uygulamak için ne kadar büyük bir özgürlük verilir. Şu anda, Oracle JVM (en az) lambda ifadesi başına bir örnek (yani farklı aynı ifadeleri arasında örnek paylaşmıyor) oluşturur ama değerleri yakalamak yok olan her ifade için tek oluşturur.
Daha fazla ayrıntı için this answer okuyabilirsiniz. Yok, ben sadece daha ayrıntılı bir açıklama verdi, ama aynı zamanda test kodu geçerli davranışlarını gözlemlemek için.
Bu Java® Dil Belirtimi, bölüm kapsamındaki “15.27.4. Run-time Evaluation of Lambda Expressions”
Özetlenebilir:
Bu kurallar Java programlama dili uygulamaları için: esneklik sunmak için tasarlanmıştır
Yeni bir nesne her değerlendirme ayrılmış olması gerekmez.
Nesneleri farklı lambda ifadeleri tarafından üretilen farklı sınıflar için (eğer cesetleri aynı ise, örneğin) ait değil.
Her nesne değerlendirme tarafından üretilen aynı sınıf (yakalanan yerel değişkenler, örneğin inlined olabilir) ait değil.
Eğer bir "örnek" mevcut, önceki lambda değerlendirme yaratılmış olmaları gerekmez (örneğin çevreleyen sınıfın başlatma sırasında ayrılmış olabilir). eğer mevcut
Nerede lambda ifade bir zaman uyumsuz ...
ArrayList üzerinde LinkedList ne zaman...
Nasıl Android üzerinde internet erişim...
'DateTime, zaman Damgası, Zaman v...
Kullanarak "yeni" bir yapı ü...