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;
  })));