利用STREAM API对LIST集合进行分组求和统计

发布时间 2023-08-17 18:24:32作者: 流云165

文章目录

 


一、原始数据及需求

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

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

在这里插入图片描述

二、利用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;
    }

 

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

处理后的数据:

在这里插入图片描述

四、实体类

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,提高多线程任务的速度。