Java List sort() 排序

sort是java.util.List接口的默认方法。

List的排序方法在Java 8中被引入。

排序方法接受比较器作为参数,并根据指定的比较器对这个列表进行排序。

java 复制代码
 default void sort(Comparator<? super E> c)

示例代码:

java 复制代码
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public class ListSort {

    private static Student zs = new Student("张三", 38, "156****6549");
    private static Student ls = new Student("李四", 28, "138****4267");
    private static Student ww = new Student("王五", 20, "186****7391");
    private static Student zs2 = new Student("张三", 26, "172****6549");
    private static Student ww2 = new Student("王五", null, "196****7391");

    public static void main(String[] args) {

        List<Student> studentList = Arrays.asList(zs, ls, ww, zs2, ww2);

        Collator collator = Collator.getInstance(Locale.CHINA);
        // 按照姓名排序
        Comparator<Student> nameComparator = Comparator.comparing(Student::getName, collator);
        // 正序
        studentList.sort(nameComparator);
        // 倒序
        studentList.sort(nameComparator.reversed());
        System.out.println("************姓名****************");
        studentList.forEach(System.out::println);

        // 年龄排序(空值最前)
        studentList.sort(Comparator.comparing(Student::getAge, Comparator.nullsFirst(Integer::compareTo)));
        System.out.println("************年龄****************");
        studentList.forEach(System.out::println);

        // 手机号前三位排序
        studentList.sort(Comparator.comparing(student -> student.getPhoneNum().substring(0, 3)));
        System.out.println("************手机号****************");
        studentList.forEach(System.out::println);

        // 多字段排序(按姓名,再按年龄)
        studentList.sort(Comparator.comparing(Student::getName, collator).
                thenComparing(Student::getAge, Comparator.nullsLast(Comparator.naturalOrder())));
        System.out.println("************多字段****************");
        studentList.forEach(System.out::println);

    }

    public static class Student {

        /**
         * 姓名
         */
        private String name;

        /**
         * 年龄
         */
        private Integer age;

        /**
         * 手机号
         */
        private String phoneNum;

        public Student(String name, Integer age, String phoneNum) {
            this.name = name;
            this.age = age;
            this.phoneNum = phoneNum;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getPhoneNum() {
            return phoneNum;
        }

        public void setPhoneNum(String phoneNum) {
            this.phoneNum = phoneNum;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", phoneNum='" + phoneNum + '\'' +
                    '}';
        }
    }

}

排序结果:

bash 复制代码
************姓名****************
Student{name='张三', age=38, phoneNum='156****6549'}
Student{name='张三', age=26, phoneNum='172****6549'}
Student{name='王五', age=20, phoneNum='186****7391'}
Student{name='王五', age=null, phoneNum='196****7391'}
Student{name='李四', age=28, phoneNum='138****4267'}
************年龄****************
Student{name='王五', age=null, phoneNum='196****7391'}
Student{name='王五', age=20, phoneNum='186****7391'}
Student{name='张三', age=26, phoneNum='172****6549'}
Student{name='李四', age=28, phoneNum='138****4267'}
Student{name='张三', age=38, phoneNum='156****6549'}
************手机号****************
Student{name='李四', age=28, phoneNum='138****4267'}
Student{name='张三', age=38, phoneNum='156****6549'}
Student{name='张三', age=26, phoneNum='172****6549'}
Student{name='王五', age=20, phoneNum='186****7391'}
Student{name='王五', age=null, phoneNum='196****7391'}
************多字段****************
Student{name='李四', age=28, phoneNum='138****4267'}
Student{name='王五', age=20, phoneNum='186****7391'}
Student{name='王五', age=null, phoneNum='196****7391'}
Student{name='张三', age=26, phoneNum='172****6549'}
Student{name='张三', age=38, phoneNum='156****6549'}
相关推荐
captain3761 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫1212 分钟前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心中有你021423 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
心疼你的一切39 分钟前
Python自动发邮件实战定时发报表
大数据·开发语言·python
步行cgn1 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog2 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老2 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang2 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
中科三方2 小时前
IPv6检测常见问题:AAAA记录检测不通过是什么原因?
开发语言·php