Java List sort() 排序

sortjava.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'}
相关推荐
yaoxin5211232 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound4863 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Ava的硅谷新视界3 小时前
用了一天 Claude Opus 4.7,聊几点真实感受
开发语言·后端·编程
rabbit_pro3 小时前
Python调用onnx模型
开发语言·python
一 乐4 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
浪客川4 小时前
【百例RUST - 010】字符串
开发语言·后端·rust
鱼鳞_4 小时前
Java学习笔记_Day29(异常)
java·笔记·学习
烟锁池塘柳04 小时前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
一叶飘零_sweeeet5 小时前
深入拆解 Fork/Join 框架:核心原理、分治模型与参数调优实战
java·并发编程
云烟成雨TD5 小时前
Spring AI Alibaba 1.x 系列【23】短期记忆
java·人工智能·spring