gpt4 book ai didi

lambda - Java 8 - 如何对列表映射中的所有列表元素求和

转载 作者:行者123 更新时间:2023-12-02 14:45:52 29 4
gpt4 key购买 nike

我有一个特定对象的列表映射,我想根据特定实例变量添加列表的所有元素。

我的对象:

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

我从数据库中获取对象类型的数组列表:

List< Object[] > results=getResults();

我使用 Java 8 按 ID 对数据进行分组,因为我想按 riskValue 进行SUM Risk 类型的所有对象具有相同的id

这就是我所做的:

List<Risk> risks=results.stream().map(Risk::new).collect(Collectors.toList());
Map<Integer, List<Risk>> byId=risks.stream.collect(Collectors.groupingBy(Risk::getId));

此时,我已按 ID 对所有风险对象进行了分组。我希望每个列表将所有对象相加 riskValue并将总计放入变量 totRisk

如何在变量 totRisk 中进行计算变量总数riskValue在每个列表中?

注1:我想使用 Java 8 执行此操作,我知道如何使用 Java 7 及更低版本执行此操作。

注2:也许也可以一次性完成,无需先按 ID 进行分组。我想要实现的是将原始List<Object[]> results中具有相同ID的所有对象求和。如果只用一条语句就能完成就更好了。

最佳答案

您必须知道您可以组合收集器。请参阅Collectors.groupingBy(Function,Collector)

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

请注意,我假设您的类Risk中有一个方法getRiskValue(),否则您必须替换Risk::getRiskValue使用 lambda 表达式 r -> r.riskValue 来访问该字段,但始终建议使用 getter 方法。

结果从 id 映射到总计。

<小时/>

再次阅读您的问题后,我注意到您实际上想要总结 riskValue 并将其存储在 eachtotRisk 中(?) 风险实例。这有点复杂,因为它不符合常见的使用模式:

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

此时我们确实应该改用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;
})));

关于lambda - Java 8 - 如何对列表映射中的所有列表元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28302358/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com