java 8 中 collections.sort() 支持 lambda 表达式和方法引用,使自定义排序更简洁:可用 (a,b)-> 比较逻辑、string::length 等方法引用、comparator.comparing().thencomparing() 实现多级排序,并需确保 list 可修改且元素支持比较。

Java 8 引入 Lambda 表达式后,Collections.sort() 的写法变得更简洁直观,尤其适合对 List 按自定义规则排序。
直接传入 Lambda 替代匿名内部类
以前排序需写冗长的 Comparator 匿名类;现在一行 Lambda 就能搞定。核心是把比较逻辑用箭头语法表达清楚。
- 基本格式:
Collections.sort(list, (a, b) -> { return a.compareTo(b); }); - 升序字符串:
Collections.sort(words, (s1, s2) -> s1.compareTo(s2)); - 降序整数:
Collections.sort(numbers, (n1, n2) -> n2 - n1);(注意整型溢出风险,推荐用Integer.compare(n2, n1))
配合方法引用进一步简化
当比较逻辑是调用对象已有方法时,可用双冒号语法替代 Lambda,更清晰。
- 按字符串长度升序:
Collections.sort(strings, Comparator.comparing(String::length)); - 按 Person 的 age 升序:
Collections.sort(people, Comparator.comparing(Person::getAge)); - 降序加
.reversed():Comparator.comparing(Person::getAge).reversed()
多级排序用 thenComparing 链式调用
先按主字段排,相同时再按次字段排,无需嵌套或复杂逻辑。
- 先按年龄升序,年龄相同时按姓名字典序:
Collections.sort(people, Comparator.comparing(Person::getAge).thenComparing(Person::getName)); - 支持混合方向:
Comparator.comparing(Person::getAge).thenComparing(Person::getName).reversed()(整体倒序,但注意优先级)
注意:List 必须可修改,且元素类型需支持比较
Collections.sort() 会原地修改列表,要求传入的是可变 List(如 ArrayList),不能是 Arrays.asList() 返回的固定大小列表(否则抛 UnsupportedOperationException)。
- 安全做法:确保 list 是 new ArrayList(...) 或其他可变实现
- 若元素为自定义类,Lambda 中访问的字段或 getter 方法必须存在且可访问
- 空值需显式处理,例如:
Comparator.comparing(p -> p.getName(), Comparator.nullsLast(String::compareTo))
不复杂但容易忽略细节,写对 Lambda 参数类型和返回值含义,排序就稳了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











