文章目录
- 0 写在前面
- 1 格式
- 1.1 介绍:
- 1.2 单个属性排序格式:
- 1.3 多个属性排序格式:
- 1.4 注意事项
- 2 代码举例
0 写在前面
有一些业务需要对集合按照一些规则进行排序,本篇介绍如何用Stream()对集合进行升序或者降序操作。
之前只有接触过使用数据库进行排序,有一些情况需要不同的排序结果,如果进行多次查询会多次操作数据库,所以有些地方使用流对集合操作是更好的选择。
1 格式
1.1 介绍:
Stream 流 -> 调用 sorted 方法 -> 方法内传入对比规则,用容器对象的属性作为入参作为排序依据,默认升序,需要倒叙的话后面调用.reversed() 方法
1.2 单个属性排序格式:
升序:list.stream().sorted(Comparator.comparing(实体::get属性)).collect(Collectors.toList());
例如:
personnelList.stream().sorted(Comparator.comparing(Personnel::getId)).collect(Collectors.toList());
降序:list.stream().sorted(Comparator.comparing(实体::get属性).reversed()).collect(Collectors.toList());
personnelList.stream().sorted(Comparator.comparing(Personnel::getId).reversed()).collect(Collectors.toList());
1.3 多个属性排序格式:
只需在比较后面加上 thenComparing 方法
集合.stream().sorted(Comparator.comparing(实体::get属性).thenComparing(实体::get属性)).collect(Collectors.toList());,
例如:
personnels.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)).thenComparing(Personnel::getEmail)).collect(Collectors.toList());
1.4 注意事项
只对属性进行排序(此属性是封装类)该属性有为 null 的情况会报错
此时需要 在Comparator.comparing()入参多加一个nullsLast()的方法
例如对单个排序:
personnelList.stream().sorted(Comparator.comparing(Personnel::getId, Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
例如对多个排序:
personnels.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)).thenComparing(Personnel::getEmail,Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
2 代码举例
实体类:
import lombok.Data;@Datapublic class Personnel {private Integer id;private String name;private String email;public Personnel() {}public Personnel(int id, String name, String email) {this.id = id;this.name = name;this.email = email;}}
测试类:
import org.junit.jupiter.api.Test;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;public class StreamSortDemo {@Testpublic void testDemo() {//模拟数据Personnel personnel1 = new Personnel(1, "张三", "zhangsan@zhangsan");Personnel personnel2 = new Personnel(3, "李四", "lisi@lisi");Personnel personnel3 = new Personnel(2, "王五", "wangwu@wangwu");//构造集合ArrayList<Personnel> personnelList = new ArrayList<>();personnelList.add(personnel1);personnelList.add(personnel2);personnelList.add(personnel3);//看一下原始集合--id分别为 13 2System.out.println("排序前:");personnelList.forEach(System.out::println);//1.正序输出, id 分别为 12 3List<Personnel> positiveList = personnelList.stream().sorted(Comparator.comparing(Personnel::getId)).collect(Collectors.toList());System.out.println("升序排序后:");positiveList.forEach(System.out::println);//2. 倒序输出, id分别为 32 1List<Personnel> reversedList = personnelList.stream().sorted(Comparator.comparing(Personnel::getId).reversed()).collect(Collectors.toList());System.out.println("倒序排序后:");reversedList.forEach(System.out::println);//有null的情况// 只对一个属性进行排序(数字)该属性有为 null 的情况会报错java.lang.UnsupportedOperationException// --对封装类Integer报错对如果是基本数据类型int则不报错Personnel personnel4 = new Personnel();personnel4.setName("岳腾");personnelList.add(personnel4);//报错代码://personnelList.stream().sorted(Comparator.comparing(Personnel::getId)).collect(Collectors.toList());//解决:List<Personnel> aboutNullList = personnelList.stream().sorted(Comparator.comparing(Personnel::getId, Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());System.out.println("有空值时,进行升序排序");aboutNullList.forEach(System.out::println);//利用多个属性进行排序,在比较后面加上thenComparing-List<Personnel> multiplePropertiesList = personnelList.stream().sorted(Comparator.comparing(Personnel::getName).thenComparing(Personnel::getEmail)).collect(Collectors.toList());System.out.println("多个值进行排序进行排序:");multiplePropertiesList.forEach(System.out::println);Personnel personnel5 = new Personnel();personnel4.setId(5);personnelList.add(personnel5);//此时再去使用多个值,这多个值都为null的话,则会报错-->/*personnelList.stream().sorted(Comparator.comparing(Personnel::getName).thenComparing(Personnel::getEmail)).collect(Collectors.toList()); */// 解决方案://对多个属性进行排序,在比较后面加上thenComparing,并忽略null值得属性。List<Personnel> multiplePropertiesAboutNullList = personnelList.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)).thenComparing(Personnel::getEmail, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());System.out.println("有空值时,多个值进行排序进行排序:");multiplePropertiesAboutNullList.forEach(System.out::println);}}