Comparator 怎么链式调用
在 Java 里,Comparator 的链式调用主要靠 Java 8 引入的方法,非常常见、也非常好用。
一、核心思路
Comparator 提供了两个关键方法用于链式调用:
✅ thenComparing
当前一个比较规则相等时,再按下一个规则比较
Comparator thenComparing(Comparator super T> other)
二、最常见的链式写法
示例对象
class User {
String name;
int age;
double salary;
// getter / constructor
}
1️⃣ 先按年龄,再按薪资
Comparator comparator =
Comparator.comparing(User::getAge)
.thenComparing(User::getSalary);
✅ 含义:
- 先按
age升序 - 如果
age相同,再按salary升序
2️⃣ 多字段排序(3 个及以上)
Comparator comparator =
Comparator.comparing(User::getAge)
.thenComparing(User::getSalary)
.thenComparing(User::getName);
三、降序 + 链式调用
1️⃣ 单个字段降序
Comparator comparator =
Comparator.comparing(User::getAge, Comparator.reverseOrder());
2️⃣ 链式 + 部分降序
Comparator comparator =
Comparator.comparing(User::getAge) // 升序
.thenComparing(User::getSalary, Comparator.reverseOrder()); // 降序
四、处理 null 值(非常实用)
1️⃣ null 排最后
Comparator comparator =
Comparator.comparing(
User::getName,
Comparator.nullsLast(String::compareTo)
);
2️⃣ 链式 + null 处理
Comparator comparator =
Comparator.comparing(
User::getName,
Comparator.nullsLast(String::compareTo)
).thenComparing(
User::getAge
);
五、完整示例
List users = new ArrayList<>();
users.sort(
Comparator.comparing(User::getAge)
.thenComparing(User::getSalary, Comparator.reverseOrder())
.thenComparing(User::getName)
);
六、总结口诀 ✅
先 comparing,再 thenComparing,想降序就 reverseOrder,想防 null 就 nullsLast
如果你愿意,我也可以帮你:
- 用 Stream.sorted() 写链式排序
- 对比 SQL ORDER BY 和 Comparator 的区别
- 讲 Comparator vs Comparable 的使用场景