Java中Lambda排序核心是传入Comparator,支持单字段升/降序、多字段链式排序、null值处理及自定义逻辑,需确保元素可比较且不修改原对象。

Java 中用 Lambda 表达式对列表排序,核心是传入 Comparator 实现,直接写在 list.sort() 或 Collections.sort() 里,简洁又直观。
基本语法:按单个字段升序/降序
假设有一个 List<Person>,Person 有 name 和 age 字段:
- 按姓名升序:
people.sort((a, b) -> a.getName().compareTo(b.getName())); - 按年龄降序:
people.sort((a, b) -> Integer.compare(b.getAge(), a.getAge()));(推荐用Integer.compare避免整数溢出) - 更简洁写法(使用方法引用):
people.sort(Comparator.comparing(Person::getName));或people.sort(Comparator.comparing(Person::getAge).reversed());
多字段排序:先按 A,再按 B
用 thenComparing 链式组合:
-
people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));→ 先按年龄升序,年龄相同时按姓名升序 -
people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName).reversed());→ 整体倒序(注意:这是对整个比较结果取反,不是每个字段都倒) - 若想“年龄升序、姓名降序”:
Comparator.comparing(Person::getAge).thenComparing(Comparator.comparing(Person::getName).reversed())
处理 null 值:避免空指针异常
字段可能为 null 时,用 Comparator.nullsFirst() 或 Comparator.nullsLast() 包装:
立即学习“Java免费学习笔记(深入)”;
-
people.sort(Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo)));→null排最后 -
people.sort(Comparator.comparing(Person::getAge, Comparator.nullsFirst(Integer::compareTo)));→null年龄排最前
自定义逻辑:比如按姓名长度排序
Lambda 适合写任意判断逻辑:
people.sort((a, b) -> Integer.compare(a.getName().length(), b.getName().length()));- 或更可读:
people.sort(Comparator.comparing(p -> p.getName().length())); - 复杂条件(如:长度相同则按字典序):
Comparator.comparing((Person p) -> p.getName().length()).thenComparing(Person::getName)
不复杂但容易忽略:确保列表元素类型支持比较操作,且 Lambda 中不要修改原对象状态;排序前确认列表非 null,必要时加判空保护。


















