背景:项目开始做统计分析,自然避免不了通过程序分组排序这些必要操作,毕竟通过程序来处理数据是基于内存的,性能效率要比直接写sql好很多。先日常记个简单的~
一.排序+分组联合使用
首先使用sorted对list进行排序,然后再使用groupingBy进行分组,代码如下:
Map<String, List<OrderBaseVO>> collectMap = historyHeaderStatisticsVOs.stream()
.sorted(Comparator.comparing(iteam -> iteam.getStatisticDate()))
.collect(Collectors.groupingBy(iteam -> iteam.getStatisticDate(), TreeMap::new, Collectors.toList()));
*需要注意的是要使用TreeMap定义分组对象,因为treeMap相对于hashMap是有序的,具体可自行百度~
二.使用sorted排序的常用场景
sorted可以说是很常用的函数了,以下是总结的几个常用场景,代码如下:
1.对list进行正序排列
public static <T> List<T> sort(List<T> list){
return list.stream().sorted().collect(Collectors.toList());
}
2.对list进行倒序排列
public static List<Integer> desc(List<Integer> list){
return list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
}
3.指定对象的某个字段属性,进行正序排列
public static List<OrderBaseVO> sortForObject(List<OrderBaseVO> list){
return list.stream().sorted(Comparator.comparing(OrderBaseVO::getStatisticDate))
.collect(Collectors.toList());
}
4.指定对象的某个字段属性,进行倒叙排列
public static List<OrderBaseVO> reversedForObject(List<OrderBaseVO> list){
return list.stream().sorted(Comparator.comparing(OrderBaseVO::getStatisticDate).reversed())
.collect(Collectors.toList());
}
5.根据多个字段,进行排序
倒序:List.sort(Comparator.comparing(Entity::getState).reversed().thenComparing(Entity::getName));
升序:List.sort(Comparator.comparing(Entity::getState).thenComparing(Entity::getName));