【发布时间】:2017-06-28 21:39:01
【问题描述】:
很简单,我有
class Per{
int a;
long b;
double c;
String d;
}
假设我有 3000 个 Per 类型的对象并收集在 List<Per> pers 中
现在我想实现:-
- 如果对象为空或
d为null或blank,则跳过 -
a的总和 -
b的总和 - 在
c上执行的操作的聚合值
老办法是
int totalA = 0; long totalB = 0l; long totalC = 0l;
for (Per per : pers) {
if (per.d != null && !per.d.trim().equals("")) {
totalA += per.a;
totalB += per.b;
totalC += someOperation(per.c);
}
}
someOperation 的实现并不重要,因为它可能很简单也可能很复杂。
如何通过 Java8 流和 lambda 表达式实现这一点?
可能的答案是这样的
int totalA = 0; long totalB=0l;
pers.stream().filter(p->{
if(p == null || p.d == null || p.d.trim().equals(""))
return false;
return true;
}).forEach(per->{
totalA += per.a;
totalB += per.b;
});
但 totalA 和 totalB 必须是最终的或有效的最终
我认为的其他可能性是:
1 使用Supplier 作为suggested 重新使用过滤后的流,然后应用映射和聚合操作。
2 收集过滤后的Per 然后做forEach
注意,我没有在此处进行任何类型的分组,也无法创建新的 Per 或更新提供的对象。
【问题讨论】:
-
您无法创建新的 Per 对象的原因是什么?因为如果可以的话,
reduce方法可能真的很有用
标签: lambda java-8 sum field aggregate