Lambda Java 8-如何对列表映射中的所有列表元素求和
我有一个特定对象列表的映射,我想根据一个特定的实例变量添加列表的所有元素 我的目标:Lambda Java 8-如何对列表映射中的所有列表元素求和,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有一个特定对象列表的映射,我想根据一个特定的实例变量添加列表的所有元素 我的目标: class Risk{ Integer id, riskValue, totRisk=0; String name; Integer getId(){ return id; } Risk(Object[] result){ id=(Integer)result[0]; riskValue=(Integer)result
class Risk{
Integer id, riskValue, totRisk=0;
String name;
Integer getId(){
return id;
}
Risk(Object[] result){
id=(Integer)result[0];
riskValue=(Integer)result[1];
name=(String)result[3];
}
}
我从数据库中获得了object类型的数组列表:
List< Object[] > results=getResults();
此时,我将所有风险对象按ID进行分组。我希望每个列表按riskValue
对所有对象求和,并在变量totRisk
如何在变量中计算每个列表中变量的总和
注1:我想用Java 8来做,我知道如何用Java 7及以下版本来做。
注2:也许也可以一次完成,不必先按ID分组。我想要实现的是将原始
列表结果中具有相同ID的所有对象相加。如果只使用一条语句就可以完成,那就更好了。您必须知道,您可以组合收集器。看
此时,我们真的应该转而使用import static java.util.stream.Collectors.*代码>:
Map<Integer, List<Risk>> byId=results.stream().map(Risk::new).collect(
groupingBy(Risk::getId, collectingAndThen(toList(), l-> {
int total=l.stream().collect(summingInt(r -> r.riskValue));
l.forEach(r->r.totRisk=total);
return l;
})));
Map byId=results.stream().Map(Risk::new).collect(
分组依据(风险::getId,collectingAndThen(toList(),l->{
int total=l.stream().collect(求和(r->r.riskValue));
l、 forEach(r->r.totRisk=总计);
返回l;
})));
只是为了确保:Map它是一个“id”的映射:“total”表示该id,对吗?最后一件事:使用上面所写的lambda表达式,用r->r替换Risk::getotrisk。totRisk对我不起作用(它无法编译)。是否有可能在不需要创建getter的情况下使用lamba实现它?
Map<Integer, Integer> byId=risks.stream.collect(
Collectors.groupingBy(Risk::getId, Collectors.summingInt(Risk::getRiskValue)));
Map<Integer, Integer> byId=results.stream().map(Risk::new).collect(
Collectors.groupingBy(Risk::getId, Collectors.summingInt(Risk::getRiskValue)));
Map<Integer, List<Risk>> byId=results.stream().map(Risk::new).collect(
Collectors.groupingBy(Risk::getId, Collectors.collectingAndThen(
Collectors.toList(), l-> {
int total=l.stream().collect(Collectors.summingInt(r -> r.riskValue));
l.forEach(r->r.totRisk=total);
return l;
})));
Map<Integer, List<Risk>> byId=results.stream().map(Risk::new).collect(
groupingBy(Risk::getId, collectingAndThen(toList(), l-> {
int total=l.stream().collect(summingInt(r -> r.riskValue));
l.forEach(r->r.totRisk=total);
return l;
})));