Java 8 İterable.() forEach vs foreach döngü | Netgez.com
SORU
19 Mayıs 2013, Pazar


Java 8 İterable.() forEach vs foreach döngü

Aşağıdakilerden hangisi Java 8'de daha iyi bir uygulamadır?

Java8:

joins.forEach((join) -> mIrc.join(mSession, join));

Java7:

for (String join : joins) {
    mIrc.join(mSession, join);
}

""Lambda, ama gerçekten performansı ve okunabilirliği de dahil olmak üzere bunları kullanarak herhangi bir avantajı var mı? ile basitleştirilmiş olabilir döngüler için bir sürü var

EDİT

Ben de uzatmak bu soruya uzun yöntemleri - biliyorum cant dönüş ya da sonu ana işlevi lambda ve bunun olması söz konusu olduğunda karşılaştırıldığında, ama başka bir şey var dikkat edilmesi gereken?

CEVAP
24 Kasım 2013, Pazar


Daha iyi uygulama for-each kullanmaktır. Bu Basit Tutun ihlal üstelik Aptalca prensibi, yeni-moda forEach() en az aşağıdaki eksiklikleri vardır:

  • Kullanımı nihai olmayan deÄŸiÅŸkenler. Bu yüzden, aÅŸağıdaki gibi bir kod dosyalarda grup lambda dönüştürülebilir mi:

    Object prev = null;
    for(Object curr : list)
    {
        if( prev != null )
            foo(prev, curr);
        prev = curr;
    }
    
  • Kontrol özel durumlar iÅŸleyebilir. Lambda aslında kontrol bloklarından yasak deÄŸil, ama Consumer gibi ortak fonksiyonel arayüzleri herhangi bir beyan yok. Bu nedenle, kontrol özel durum oluÅŸturduÄŸunda baÅŸka herhangi bir kod try-catch Throwables.propagate() sarın gerekir. Ama eÄŸer o yoksa bile, her zaman atılan özel durum ne olur belli deÄŸil. Bir yere forEach() bu süre zarfında yutmuÅŸ olabilir

  • Sınırlı denetim akışı. Lambda return-her bir continue eÅŸittir, ama break bir eÅŸdeÄŸeri yoktur. Ayrıca zor dönüş deÄŸerleri, kısa devre gibi ÅŸeyler var yaset bayraklareÄŸer bu ihlal olmasaydı . iÅŸler biraz alieviated, olan ( ^em>nihai olmayan hiçbir deÄŸiÅŸkenkuralı). "This is not just an optimization, but critical when you consider that some sequences (like reading the lines in a file) may have side-effects, or you may have an infinite sequence."

  • Buna paralel olarak yürütebilirbir korkunç , korkunç optimize edilmiÅŸ. olması gereken kod ama 0.1% her ÅŸey için Herhangi bir paralel kod kilitleri, uçucular, ve çok iÅŸ parçacıklı geleneksel yürütme özellikle kötü diÄŸer yönleri deÄŸil ise bile () düşünülmüş olmalı. Herhangi bir hata bulmak zor olacak.

  • Performans zarar verebilirbu JİT dosyalarda grup optimize etmek için() döngüler, özellikle Lambda yeni olduÄŸunu ÅŸimdi net gördüm. aynı ölçüde lambda ""Modern JİT derleyici kod çalıştıran gerçekleÅŸtiren geliÅŸmiÅŸ analiz ve dönüşüm için Lambda küçük olan) arıyorum, ama. yükü anlamına gelmez optimizasyon tarafından

  • EÄŸer bir paralellik varsa, muhtemelen çok daha hızlı ve çok daha fazla bir ExecutorService kullanmak zor deÄŸil. Akışları otomatik ve sihirli (okuma: senin sorunun hakkında pek bir ÅŸey yokveuzman (genel durum) için verimsiz paralellik stratejisi (çatal-katıl özyinelemeli bozunma) kullanın.

  • Hata ayıklama daha karmaşık hale getiririç içe çaÄŸrı hiyerarÅŸisi ve , Tanrı korusun, çünkü, infaz paralel. Hata ayıklayıcı çevreleyen kod gösteren deÄŸiÅŸkenler sorunları olabilir, ve adım gibi iÅŸler beklendiÄŸi gibi çalışmayabilir.

  • Sopalarla bir BoÄŸaz baÅŸparmak gibi dışarı. Java dili için-her statetement vardır. Neden bir iÅŸlev çaÄŸrısı ile deÄŸiÅŸtirin? Neden ifadelerde yan etkileri bir yerlerde saklanıyor teÅŸvik? Neden hantal bir-gömlekleri teÅŸvik? -Her yeni istesekte istemesekte normal dosyalarda grup karıştırma kötü bir üslup. Kod lazım konuÅŸ cümleler (desen, o daha çabuk kavrar nedeniyle tekrarlama) ve daha az cümleler kullanılır net Kodu ve daha az zaman harcıyor karar verirken hangi tabiri kullanmak için büyük bir zaman boÅŸaltmak için mükemmelliyetçi gibi kendimi!).

Gördüğünüz gibi, bu dosyalarda grup büyük bir hayranı değilim() mantıklı durumda.

Bana özellikle saldırgan Stream Iterable uygulamak için-her bir kullanılan olamaz değil aslında, sadece bir forEach(). Bu yüzden bana değil fathomable. (Kesinlikle C#'ın tasarımcıları gerekli olduğunu düşünmüyordu.) İterables stream.collect(Collectors.toList()) stream.toArray( T[]::new ) kullanarak Akarsu zorlama ve for-each ile onları kullanmanızı tavsiye ederimEdit: Aynı zamanda for(T element : (Iterable<T>)stream::iterator) ile bir İterable o görünebilir gibi şaşırtıcı olarak () içine akışını zorlamak için.

Bu, forEach() aşağıdakiler için yararlıdır " dedi

  • Atomik senkronize bir liste içinde dolaÅŸmak. Bundan önce, bir liste Collections.synchronizedList() ile oluÅŸturulan ve get veya set gibi ÅŸeyler için saygı ile atom oldu, ama yineleme zaman güvenli iÅŸ parçacığı deÄŸildi.

  • Yürütme (uygun paralel bir akış kullanarak) paralel. Bu sorunu performans varsayımlar Dere ve Spliterators yerleÅŸik eÅŸleÅŸirse kod vs birkaç satır bir ExecutorService kullanarak kaydeder.

  • Hangi özel kaplarsenkronize listesi gibi, yineleme bu insanlar daha fazla örnek getirebilir sürece büyük ölçüde teorik olsa da kontrolü elinde tutmaya yarar

  • Tek bir iÅŸlevi daha temiz bir ÅŸekilde arıyorforEach() ve yöntem bir referans kullanarak deÄŸiÅŸken, list.forEach (obj::someMethod) yani). Ancak, akılda tutulması kontrol istisnaları puan, daha zor hata ayıklama ve cümleler sayısını azaltarak kod yazarken kullanın.

Makaleler referans için kullanılabilir:

DÜZENLEME:Lambda için orijinal önerilerden bazıları gibi görünüyor (http://www.javac.info/closures-v06a.html), bahsettiğim sorunların bir sürü kendi komplikasyonları, elbette eklerken () çözüldü.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • geraldnonadoez

    geraldnonado

    3 Temmuz 2013
  • YEAH1TV

    YEAH1TV

    19 ÅžUBAT 2009