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.
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. –
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
Tamam, teşekkürler Pillar ve Tunaki. Yazmak için daha temiz bir yol olmadığını berbat bir şey. – twentylemon