Java 8 的 Lambda 表达式使 Arrays.sort() 排序更简洁:可用 (a,b)->compare 代替匿名 Comparator,支持方法引用(如 Comparator.comparing(Student::getScore))和多级排序(如 reversed().thenComparing),但原始类型数组不适用需转包装类或 Stream。

Java 8 引入 Lambda 表达式后,Arrays.sort() 可以直接配合自定义比较逻辑,无需再写冗长的匿名内部类或额外的 Comparator 实现类,对象排序代码大幅精简。
用 Lambda 替代匿名 Comparator
传统方式需显式 new 一个 Comparator,而 Lambda 可将比较逻辑压缩为一行表达式:
// 假设有 Student 类:String name; int score;
Student[] students = { /* ... */ };
<p>// 旧写法(冗长)
Arrays.sort(students, new Comparator<Student>() {
public int compare(Student a, Student b) {
return Integer.compare(a.getScore(), b.getScore());
}
});</p><p>// 新写法(Lambda,清晰简洁)
Arrays.sort(students, (a, b) -> Integer.compare(a.getScore(), b.getScore()));
链式调用与方法引用进一步简化
当比较逻辑是单一属性的自然序或逆序时,可直接用方法引用,更直观:
- 按分数升序:
Arrays.sort(students, Comparator.comparingInt(Student::getScore)); - 按姓名升序:
Arrays.sort(students, Comparator.comparing(Student::getName)); - 按分数降序:
Arrays.sort(students, Comparator.comparingInt(Student::getScore).reversed());
注意:这些写法本质仍是传入 Comparator,但 Comparator 的静态工厂方法 + 方法引用让语义更明确、代码更安全(避免空指针需额外处理)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
多级排序一次写完
Lambda 配合 thenComparing 可轻松实现“主序+次序”逻辑,无需嵌套条件判断:
- 先按分数降序,分数相同时按姓名升序:
Arrays.sort(students, Comparator.comparingInt(Student::getScore).reversed().thenComparing(Student::getName)); - 支持 null 安全比较(如姓名可能为 null):
thenComparing(Comparator.nullsLast(Comparator.naturalOrder()))
注意原始类型数组不能直接用 Lambda
Arrays.sort() 对 int[]、double[] 等原始数组有专用重载,不接受 Comparator。若需用 Lambda 排序,必须转为包装类型数组(如 Integer[]),或改用 Stream 方式:
- 原始数组建议仍用
Arrays.sort(intArray)(高效且原生支持) - 若坚持函数式风格,可用:
intArray = Arrays.stream(intArray).boxed().sorted().mapToInt(i -> i).toArray();
这种方式会创建新数组,适合小数据量或对可读性要求高于性能的场景。

















