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)
将嵌套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)
| 归档时间: |
|
| 查看次数: |
7561 次 |
| 最近记录: |