我有一个嵌套的for循环我想用流代替,但我无法弄清楚如何,如果可能的话。基本循环在
之下for (Object outer : owner.getOuterList())
for (Object inner : owner.getInnerList())
if (cond(outer, inner))
func(outer, inner);
else
moo(outer, inner);
使用forEach
而不是循环,我能够到达的唯一解决方案基本上看起来完全相同。 flatMap
似乎适用,但我无法弄清楚如何获取这两个列表。
答案 0 :(得分:1)
主要问题是内循环体
if (cond(outer, inner))
func(outer, inner);
else
moo(outer, inner);
在Stream API中没有对应项,并且对于大多数可思考的解决方案而言仍然只是一个不透明的操作,因此最简单的解决方案是将其表示为Consumer
,您可以使用嵌套的forEach
来调用它。对您已经拥有的嵌套for
循环没有任何好处。
如果要强制执行基于flatMap
的解决方案,可以执行以下操作:
owner.getOuterList().stream().flatMap(
outer -> owner.getInnerList().stream().<Runnable>map(
inner -> cond(outer, inner)? () -> func(outer, inner): () -> moo(outer, inner))
).forEach(Runnable::run);
它不需要Pair / Tuple类型来映射到[outer,inner]
,因为函数本身能够捕获这些值。请注意,这将评估内部流处理中的条件,但实际调用func
或moo
将在外部流处理中发生。您可以使用
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);
如上所述,它将你原来的内环的身体视为不透明的动作。
我认为,很明显,这里没有真正赢得原始嵌套for
循环。