背景:
在项目中遇到需要对集合数据进行日期排序,并对数据进行计算
Stream流-三种重载分组操作
方法1
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier)
方法2
public static <T, K, A, D>
Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
Collector<? super T, A, D> downstream)
方法3
public static <T, K, D, A, M extends Map<K, D>>
Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
Supplier<M> mapFactory,
Collector<? super T, A, D> downstream)
其实1,2最后都是调用的方法3实现的
实操
集合的数据结构
@Data
public class ElecticResp {
// 数据时间
@JsonFormat(pattern = "yyyy-MM-dd")
private Date dataTime;
// 企业编码
private String entCode;
// 企业名称
private String entName;
// 用电量
private BigDecimal elecConsumption;
}
将集合根据不同类型进行日期分组,并将BigDecimal字段累加值
/*
分组计算 List<ElecticResp> respList = new ArrayList<>();
*/
if("3".equals(electricReq.getType())){
resultMap = respList.stream().collect(Collectors.groupingBy((x -> new SimpleDateFormat("yyyy").format(x.getDataTime())), Collectors.summarizingDouble(p -> BigDecimal.ZERO.add(p.getElecConsumption()).doubleValue())));
}else if ("2".equals(electricReq.getType())){
resultMap = respList.stream().collect(Collectors.groupingBy((x -> new SimpleDateFormat("yyyy-MM").format(x.getDataTime())), Collectors.summarizingDouble(p -> BigDecimal.ZERO.add(p.getElecConsumption()).doubleValue())));
}else if ("1".equals(electricReq.getType())){
resultMap = respList.stream().collect(Collectors.groupingBy((x -> new SimpleDateFormat("yyyy-MM-dd").format(x.getDataTime())), Collectors.summarizingDouble(p -> BigDecimal.ZERO.add(p.getElecConsumption()).doubleValue())));
}