如何用流替换double for(递增)

时间:2017-05-23 17:28:45

标签: java java-8 java-stream

如何使用stream api?

编写这样的java代码
int i = 0;
for (Foo[] foo : foo.getFoo()) {
    for (Bar bar : foo) {
        if (bar.getSometing() == something) {
            return "something"
        }
    }
    i++;
}

2 个答案:

答案 0 :(得分:0)

您希望anyMatch方法和嵌套数组/集合的flatMap

Collection<Bar[]> foo2 = foo.getFoo();
if (foo2.stream().flatMap(Arrays::stream).anyMatch(bar -> bar.getSomething() == something)) {
    return "something";
}

这看起来更好,但运行速度比for-each版本慢,因为Java流有很多开销。您可以尝试在.parallel()之前添加flatMap,但这是否有帮助取决于很多因素。

答案 1 :(得分:0)

解决方案可能是:

return Arrays.stream(foo.getFoo())
    .flatMap(foo -> foo.getBar().stream())
    .filter(bar -> bar.getSomething().equals(something))
    .findAny()
    .map(a -> "something")
    .orElse("some default return value");

我已将想象力用于上述代码的一些事情:

  • Foo类有getBar()方法,返回List<Bar>
  • 您希望在过滤条件
  • 中使用equals(something)代替== something
  • 当找不到Bar实例时,存在一些其他返回值
  • 计数器变量i的用途是什么?我没有把它包含在我的答案中,因为你没有表现出你在做什么