如何在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();