【stream 排序】处理排序时列表存在为空的数据以及组合排序问题

109 阅读1分钟

需求

对一个集合中其中一个或者多个字段进行排序,并且是组合排序,并且字段可能为空

如:Person对象

@Data
public class Person {

    private String name;

    private Integer age;

}

测试

public class MainTest {

    public static void main(String[] args) {
        Person person1 = new Person().setName("Lee").setAge(20);
        Person person2 = new Person().setName("Choi").setAge(70);
        Person person3 = new Person().setName("Lee").setAge(40);
        Person person4 = new Person().setName("Choi").setAge(50);
        Person person5 = new Person().setName("Choi").setAge(60);
        Person person6 = new Person().setName("Lee").setAge(null);
        Person person7 = new Person().setName(null).setAge(80);
        List<Person> list = Arrays.asList(person1, person2, person3, person4, person5, person6, person7);
        ```
// 对名称进行排序 将 null 字段放后面
list.stream().sorted(Comparator.comparing(Person::getName, Comparator.nullsLast(Comparator.naturalOrder()))).forEach(System.out::println);
System.out.println("==========================================");
// 对age进行降序排序 将 null 字段放前面
list.stream().sorted(Comparator.comparing(Person::getAge, Comparator.nullsFirst(Comparator.reverseOrder()))).forEach(System.out::println);
System.out.println("==========================================");
// 先对名称进行排序,再对age进行排序,并将 null 字段放后面
list.stream().sorted(Comparator.comparing(Person::getName, Comparator.nullsLast(Comparator.naturalOrder()))
        .thenComparing(Person::getAge, Comparator.nullsLast(Comparator.naturalOrder()))).forEach(System.out::println);

}