利用Stream API对List集合进行分组求和统计

文章目录

  • 一、原始数据及需求
  • 二、利用Stream API处理List集合
  • 三、处理后得到符合需求的数据
  • 四、实体类
  • 总结


一、原始数据及需求

需求:发货地和收货地相同的数据,合并这两项,并计算其他两项的数据之和

拿到的原始数据如下图所示:

利用Stream API对List集合进行分组求和统计_第1张图片

二、利用Stream API处理List集合

代码如下:

    @Override
    public Map<String, Object> countCarLine(String begin, String end) {
     
        // 线路统计
        List<CarLineVO> carLineVOS = dashboardMapper.countCarLine(begin, end);

		// 接收处理后的数据
        List<CarLineVO> newCarLineVOs = new ArrayList<>();
        // 数据分组统计处理
        carLineVOS.parallelStream()
                .collect(Collectors.groupingBy(item -> (item .getDeliverAddress() + item .getCollectAddress()), Collectors.toList()))
                .forEach((id, transfer) -> {
     
                    transfer.stream()
                            .reduce((a, b) -> new CarLineVO(a.getDeliverAddress(), a.getCollectAddress(), a.getCollectNetWeight().add(b.getCollectNetWeight()), a.getTotalFreightPrice().add(b.getTotalFreightPrice())))
                            .ifPresent(newCarLineVOs::add);
                });

        Map<String, Object> map = new HashMap<>();
        map.put("carLine", newCarLineVOs);
        return map;
    }

三、处理后得到符合需求的数据

处理后的数据:

利用Stream API对List集合进行分组求和统计_第2张图片

四、实体类

CarLineVO类:

/**
 * @Author: Ron
 * @Create: 2020 10:14
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CarLineVO {
     

    private String deliverAddress;

    private String collectAddress;

    private BigDecimal collectNetWeight;

    private BigDecimal totalFreightPrice;
}

实体类使用lombok插件


总结

新建一个List集合存放CarLineVO对象,并用lambda表达式进行处理,其中parallelStream是一个并行执行的流.它通过默认的ForkJoinPool,提高多线程任务的速度。

参考资料

你可能感兴趣的:(利用Stream API对List集合进行分组求和统计)