Java Stream Grouping通过收集自定义对象

时间:2019-01-10 10:08:07

标签: java java-8 hashmap java-stream grouping

我有温度班

class Temperature {
    double minTemp;
    double maxTemp;
    String city;
    String country;
}

我还有另外一个课程,可以维护温度

class Temperatures {
    List<Temperature> temperatures;
}

我想使用流按国家(地区)名称对温度进行分组。

我想要的是

public Map<String, Temperatures> temperaturesByCountry()

但是我无法使用流获取“温度”作为地图值,我得到的是“温度列表”。

我的分组依据实施

Map<String, List<Temperature>> result = this.getTemperatures()
                .stream()
                .collect(Collectors.groupingBy(Temperature::getCountry));

我想获得Map<String, Temperatures>而不是Map<String, List<Temperature>>

我该如何实现??

2 个答案:

答案 0 :(得分:3)

假设您有构造函数Temperatures(List<Temperature> temperatures) 这应该可以解决问题:

Map<String, Temperatures> result = 
       this.getTemperatures()
           .stream()
           .collect(groupingBy(Temperature::getCountry, 
                               collectingAndThen(toList(), Temperatures::new)));

答案 1 :(得分:1)

或者,您可以将Map.forEach与现有信息合并为:

Map<String, Temperatures> temperaturesByCountry = new HashMap<>();
Map<String, List<Temperature>> result = this.getTemperatures()
        .stream()
        .collect(Collectors.groupingBy(Temperature::getCountry));
result.forEach((k, v) -> temperaturesByCountry.put(k, new Temperatures(v)));