使用 Java 8 流迭代两个列表

jli*_*kos 4 lambda java-8 java-stream

如何在 Java 8 流中编写以下内容?

int total = 0;
  for (ObjectA obja : rootObj.getListA()) {
    for (ObjectB objb : obja.getListB()) {
        total += objb.getCount() * obja.getCount();
    }
   }

return total;
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

将嵌套for循环转换为StreamAPI 使用的规范解决方案是通过flatMap

return rootObj.getListA().stream()
.flatMapToInt(objA->objA.getListB().stream()
                                   .mapToInt(objB->objB.getCount() * objA.getCount()))
.sum();
Run Code Online (Sandbox Code Playgroud)

这允许您为每个内部迭代执行一个操作。但是,在求和的特殊情况下,您可以简化操作,因为无论您是计算(a+b+c+d)还是计算(a+b)+(c+d)

return rootObj.getListA().stream()
.mapToInt(objA->objA.getListB().stream()
                               .mapToInt(objB->objB.getCount() * objA.getCount()).sum())
.sum();
Run Code Online (Sandbox Code Playgroud)

当我们记住基本算术时,我们还应该记住它(a*x)+(b*x)等于(a+b)*x,换句话说,不需要将 的每一项乘以ListB的计数,objA因为我们也可以将结果总和与该计数相乘:

return rootObj.getListA().stream()
.mapToInt(objA->objA.getListB().stream().mapToInt(ObjectB::getCount).sum()*objA.getCount())
.sum();
Run Code Online (Sandbox Code Playgroud)