SORU
17 Aralık 2014, ÇARŞAMBA


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
17 Aralık 2014, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canal de arkyoru

    Canal de ark

    18 Ocak 2007
  • Fraser Raft

    Fraser Raft

    9 Mart 2010
  • Lamborghini

    Lamborghini

    13 Aralık 2005