在stream流中有collect方法,可以使用Colloctors.toMap, toList, toSet等等, 但是随着业务需求的复杂简单的数据结构已经满足不了业务需求.
假如我现在需要一个这种结构:
Map<String, Map<Integer, Map<Integer, Double>>> = new HashMap<>();
这种多层嵌套的map,那么就需要使用到 Collectors.groupingBy方法
//源数据
List<HistVolume> data = new ArrayList();
//数据处理
Map<String, Map<Integer, Map<Integer, Double>>> collect = data.stream()
.collect(Collectors.groupingBy(HistVolume::getFlightRoute,
Collectors.groupingBy((HistVolume d) -> DateUtil.month(d.getFlightDate()),
Collectors.groupingBy((HistVolume d) -> DateUtil.dayOfWeek(d.getFlightDate()),
Collectors.averagingDouble(HistVolume::getSaleVolume)))));
里面需要解释的点有两个 1.在多层嵌套时你想使用 实体类名::get方法时idea可能会识别不出来, 所以需要一个这么写(实体类 别名) -> 别名.方法(); 2.另一个需要说的是Collectors.averagingDouble方法, 简单来说就是平均数,把分组的结果进行平均返回.