2016-04-13 49 views
0

İç içe geçmiş bir döngüye sahibim Akımlarla değiştirmek istiyorum, ancak eğer mümkünse, nasıl yapılacağını anlayamıyorum. Temel döngüJava akışları, döngü için iç içe yerleştirilir

for (Object outer : owner.getOuterList()) 
    for (Object inner : owner.getInnerList()) 
     if (cond(outer, inner)) 
      func(outer, inner); 
     else 
      moo(outer, inner); 

Ben gelmesi mümkün oldum tek çözüm temelde yerine döngü forEach kullanarak tamamen aynı görünüyor altındadır. flatMap uygulanabilir görünüyor ancak iki listeyi nasıl alacağımı anlayamıyorum.

+0

Bunlar tamamen zorunlu olan şeylerse, evet, tam olarak aynı görünecektir. Akımlar, genellikle, _new_ elementlerini dönüştürmek ve filtrelemek içindir. –

+1

Yep, @Pillar link temelde ihtiyacınız olan şeydir. '.flatMap (dış -> owner.getInnerList(). stream() haritası (iç -> yeni Nesne [] {dış, iç}))' Sorun, her zaman hem iç hem de iç tutmak için bir Tuple sınıfına sahip olmaktır. outer'. Her ikisi de 'Object' olduklarından beri, bir diziyi kötüye kullanabiliriz ... Sonuçta:' for' döngüsünü koru. – Tunaki

+0

Tamam, teşekkürler Pillar ve Tunaki. Yazmak için daha temiz bir yol olmadığını berbat bir şey. – twentylemon

cevap

1

ana problem, iç döngü gövdesi

if (cond(outer, inner)) 
    func(outer, inner); 
else 
    moo(outer, inner); 

Akış API hiçbir benzeri yer alır ve en düşünülebilir çözeltiler için tek opak aksiyon kalır, böylece basit çözüm Consumer olarak ifade olduğunu olan zaten sahip olduğunuz iç içe geçmiş for döngüsüne hiçbir yarar sağlamayan yuvalanmış bir forEach kullanarak çağırırsınız.

Bir flatMap tabanlı bir çözüm uygulamak istiyorsanız, aşağıdakileri yapabilirsiniz: Bu kullanıcının kendisi bu yakalama yeteneğine sahiptir fonksiyonları olarak [outer,inner] için haritalama için Çifti/kayıt düzeni türünü gerekmez

owner.getOuterList().stream().flatMap(
    outer -> owner.getInnerList().stream().<Runnable>map(
     inner -> cond(outer, inner)?() -> func(outer, inner):() -> moo(outer, inner)) 
).forEach(Runnable::run); 

değerler. Bunun, iç akış işlemindeki durumu değerlendireceğini, ancak func veya moo'un gerçek akışının dış akış işleminde gerçekleşeceğini unutmayın. Sen söylediği gibi, opak eylem gibi orijinal iç döngünün vücut davranır

owner.getOuterList().stream().flatMap(
    outer -> owner.getInnerList().stream().<Runnable>map(
     inner ->() -> { if(cond(outer,inner)) func(outer,inner); else moo(outer,inner); }) 
).forEach(Runnable::run); 

ile dış akışı içinde işleme herşeyi zorlayabilir.

Sanırım, burada orijinal yuvalanmış for döngüsünün üzerinde gerçek bir kazanç olmadığının açık olduğunu düşünüyorum.

İlgili konular