Java流替换嵌套的for循环

时间:2016-04-13 21:51:43

标签: java java-stream

我有一个嵌套的for循环我想用流代替,但我无法弄清楚如何,如果可能的话。基本循环在

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

使用forEach而不是循环,我能够到达的唯一解决方案基本上看起来完全相同。 flatMap似乎适用,但我无法弄清楚如何获取这两个列表。

1 个答案:

答案 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],因为函数本身能够捕获这些值。请注意,这将评估内部流处理中的条件,但实际调用funcmoo将在外部流处理中发生。您可以使用

强制处理外部流中的所有内容
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循环。