需求:发货地和收货地相同的数据,合并这两项,并计算其他两项的数据之和
拿到的原始数据如下图所示:
代码如下:
@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,提高多线程任务的速度。
参考资料