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

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

return total;

最佳答案

通过for将嵌套的Stream循环转换为flatMap API用法的规范解决方案是:

return rootObj.getListA().stream()
.flatMapToInt(objA->objA.getListB().stream()
                                   .mapToInt(objB->objB.getCount() * objA.getCount()))
.sum();


这使您可以为每个内部迭代执行一个操作。但是,在特殊的求和情况下,您可以简化运算,因为计算(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();


当我们想起基本算术时,还应该记得(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();

07-28 01:23
查看更多