java中lambda表达式结合集合排序的核心是替代comparator匿名类,通过简洁lambda或comparator.comparing()实现升序、降序、空值处理及多字段链式排序,需确保list可修改、字段可访问并显式处理null。

Java 中 Lambda 表达式结合集合排序,核心是替代传统 Comparator 匿名类,把“怎么比”写成一行简洁逻辑,既直观又安全。
直接传 Lambda 给 sort() 方法
对可修改的 List(如 ArrayList),可直接用 list.sort() 或 Collections.sort(),参数是 (a, b) -> 比较结果:
- 升序整数:
numbers.sort((a, b) -> Integer.compare(a, b)); - 降序字符串:
words.sort((s1, s2) -> s2.compareTo(s1)); - 按长度升序:
strings.sort((s1, s2) -> Integer.compare(s1.length(), s2.length()));
注意:避免用 a - b 做整数比较,易溢出;优先用 Integer.compare()。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
用 Comparator.comparing() 配合方法引用
当比较逻辑是调用对象已有方法时,用 Comparator.comparing(XXX::method) 更清晰、更类型安全:
- 按姓名升序:
students.sort(Comparator.comparing(Student::getName)); - 按年龄降序:
students.sort(Comparator.comparing(Student::getAge).reversed()); - 空值放最后:
students.sort(Comparator.comparing(Student::getName, Comparator.nullsLast(String::compareTo)));
多字段链式排序(thenComparing)
用 .thenComparing() 实现主次分明的组合排序,逻辑一目了然:
- 先按年龄升序,年龄相同时按姓名升序:
students.sort(Comparator.comparing(Student::getAge).thenComparing(Student::getName)); - 混合方向:年龄升序 + 姓名降序:
Comparator.comparing(Student::getAge).thenComparing(Student::getName).reversed()不推荐——reversed()作用于整个链;应写成:Comparator.comparing(Student::getAge).thenComparing(Student::getName, String::compareToDescending)
注意几个关键前提
再简洁的 Lambda 也绕不开基础约束:
-
List必须可修改,不能是Arrays.asList()返回的固定大小列表(否则抛UnsupportedOperationException) - 自定义类字段或 getter 必须存在且可访问,否则编译不通过
- 涉及
null值时,必须显式用nullsFirst()或nullsLast()处理,否则运行时可能空指针 -
list.sort()是就地修改;若想保留原列表,改用stream().sorted().collect(Collectors.toList())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










