java中对arraylist多条件排序需用comparator接口链式调用thencomparing(),按年龄升序→姓名字典序→薪资降序排列,支持null处理与比较器复用。

Java 中对 ArrayList 进行多条件自定义排序,核心是使用 Comparator 接口配合 Collections.sort() 或 list.sort() 方法,通过链式调用 thenComparing() 实现多级优先级排序。
定义实体类并重写比较逻辑
假设有一个 Person 类,需按「年龄升序 → 姓名字典序 → 薪资降序」排序:
public class Person {
private String name;
private int age;
private double salary;
// 构造、getter 省略
}
关键不是重写 compareTo(),而是外部构造 Comparator:
- 用
Comparator.comparing()指定第一排序字段和顺序(默认升序) - 用
thenComparing()追加后续条件;降序用reversed() - 字符串比较推荐用
String::compareTo(区分大小写)或String.CASE_INSENSITIVE_ORDER
使用 Lambda 或方法引用写简洁比较器
推荐方式(Java 8+):
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
list.sort(
Comparator.comparing(Person::getAge) // 年龄升序
.thenComparing(Person::getName) // 姓名升序
.thenComparingDouble(p -> -p.getSalary()) // 薪资降序(取负实现)
);
或更清晰的写法(避免取负):
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.thenComparing(Person::getSalary, Comparator.reverseOrder())
);
处理 null 值和空字符串
若字段可能为 null,直接调用 getter 会抛 NullPointerException。应使用 Comparator.nullsFirst() 或 nullsLast() 包装:
Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))- 对数值类型,
Comparator.nullsLast(Comparator.naturalOrder()) - 也可先过滤或统一设默认值(如空名设为
"zzz"),但需业务确认语义
复用与封装比较器
把常用排序逻辑封装成静态方法或常量,提高可读性与复用性:
public class PersonSorters {
public static final Comparator<person> BY_AGE_NAME_SALARY_DESC =
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.thenComparing(Person::getSalary, Comparator.reverseOrder());
}
// 使用时
list.sort(PersonSorters.BY_AGE_NAME_SALARY_DESC);</person>
多个场景可组合:比如搜索结果优先按匹配度,再按时间倒序,再按名称升序——同样适用链式 thenComparing。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










