使用Java Stream分组后,如何对列表中对象的Map <integer,double =“”>中的Doubles求和

时间:2018-07-31 20:55:37

标签: java java-8 java-stream

我有以下课程:

public class Response {
     private final Map<Integer, Double> totalListPerKey;
     private final String key;
}

我有一个Collection<Response> responses,需要按键分组,并根据totalListPerKey中的匹配键(整数)对集合中所有项目的映射totalListPerKey中的Double值求和。

Response A = new Response(new HashMap[(1234,325.3),(2345,123.5)],test)
Response B = new Response(new HashMap[(1234,454.3),(2345,50)],test)

预期结果:

Object(test,new HashMap[(1234,779.6),(2345,173.5)])

2 个答案:

答案 0 :(得分:0)

经过您的解释

Map<Integer, Set<Double>> collectSetOfDoublesByIntKey = objsWithIntAndDouble.stream().collect( Collectors.groupingBy(Obj::getInt, Collectors.mapping(Obj::getDouble, Collectors.toSet()) ) );
Map<Integer, Double> collectSumOfDoublesByIntKey = objsWithIntAndDouble.stream().collect( Collectors.groupingBy(Obj::getInt, Collectors.summingDouble(Obj::getDouble) ) ); 

答案 1 :(得分:0)

您需要遍历响应的键,例如响应B,检查响应A中是否存在该键,如果存在,则将总和分配给响应A中该键的值(或其他但不是最终值)。 / p>

编辑:如果不存在该密钥,则只需将该条目复制到最终响应中,以便将来进行分组。

如果您要单独保留值,则应保留

之类的地图

private final Map<Integer, List<Double>> totalListPerKey;的双精度值列表,而不只是一个双精度值。