List排序

1、使用匿名比较器排序

// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
    add(new Person(1, 30, "北京"));
    add(new Person(2, 20, "西安"));
    add(new Person(3, 40, "上海"));
}};
// 使用匿名比较器排序
Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p2.getAge() - p1.getAge();
    }
});
// 打印 list 集合
list.forEach(p -> {
    System.out.println(p);
});
Person(id=3, age=40, name=上海)
Person(id=1, age=30, name=北京)
Person(id=2, age=20, name=西安)

2、使用 Stream 流排序

在 JDK 8 之后可以使用更加简单的方法 Stream 流来实现排序功能

// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
    add(new Person(1, 30, "北京"));
    add(new Person(2, 20, "西安"));
    add(new Person(3, 40, "上海"));
}};
// 使用 Stream 排序
// 其中 reversed() 表示倒序的意思,如果不使用此方法则是正序。
list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
// 打印 list 集合
list.forEach(p -> {
    System.out.println(p);
});
Person(id=3, age=40, name=上海)
Person(id=1, age=30, name=北京)
Person(id=2, age=20, name=西安)

扩展:排序字段为 null

使用 Stream 进行排序时,如果排序的字段出现 null 值就会导致异常发生

// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
    add(new Person(30, "北京"));
    add(new Person(10, "西安"));
    add(new Person(40, "上海"));
    add(new Person(null, "上海"));
}};
// 按照[年龄]正序,但年龄中有一个 null 值
// Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面,如果想要将 null 值放到集合最后面可以使用 Comparator.nullsLast。
list = list.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsFirst(Integer::compareTo)))
    .collect(Collectors.toList());
// 打印 list 集合
list.forEach(p -> {
    System.out.println(p);
});
posted @ 2023-09-12 09:54  種瓜得豆  阅读(2)  评论(0编辑  收藏  举报