Java List集合Stream流多字段分组获取字段值和

说明:实际业务开发中,从数据库中获取所有站点降水数据,需要对站点降水进行累加,根据站点进行分组,然后将分组之后的降水进行累加。下面的方法就是使用Stream流进行站点分组,获取分组之后降水累加。

1、业务代码:

public List<AtstationDTO> getTimeRangeRainfall(Long startTime, Long endTime) {
    List<AtstationDTO> rainfalls = new ArrayList<>();

    List<AtstationDTO> stations = new ArrayList<>();
    List<String> tableNames = CommonTableName.calcTimeRangeToTableNames(DateUtils.timestampToDate(startTime), DateUtils.timestampToDate(endTime), "data_atstation_all", "base");
    for (String tableName : tableNames)
        stations.addAll(atstationMapper.selectRainfallByTime(tableName, startTime, endTime));

    stations.parallelStream().collect(Collectors.groupingBy((station) -> new AtstationDTO(station.getStationIdC(), station.getStationName(), station.getLon(), station.getLat()), Collectors.summarizingDouble(AtstationDTO::getMinuteRainfall))).forEach((key, value) -> {
        key.setTimestamp(endTime);
        key.setMinuteRainfall((float)value.getSum());
        rainfalls.add(key);
    });

    return rainfalls;
}

核心代码:

stations.parallelStream().collect(Collectors.groupingBy((station) -> new AtstationDTO(station.getStationIdC(), station.getStationName(), station.getLon(), station.getLat()), Collectors.summarizingDouble(AtstationDTO::getMinuteRainfall))).forEach((key, value) -> {
    key.setTimestamp(endTime);
    key.setMinuteRainfall((float)value.getSum());
    rainfalls.add(key);
});

版权声明:本文为weixin_44917045原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。