一、原始数据及需求
需求:发货地和收货地相同的数据,合并这两项,并计算其他两项的数据之和
拿到的原始数据如下图所示:
二、利用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,提高多线程任务的速度。