在 Java 中,Comparator 是一个函数式接口(@FunctionalInterface),用于定义“对象之间的比较规则”,它本身不依赖对象内部实现。相比 Comparable(对象“自己知道自己怎么排”),Comparator 更灵活,适用于多种排序和比较场景。
下面按常见使用场景系统说明:
List<String> list = Arrays.asList("b", "a", "c");
list.sort(Comparator.naturalOrder());
或自定义规则:
list.sort((x, y) -> y.length() - x.length());
list.stream()
.sorted(Comparator.comparing(String::length))
.collect(Collectors.toList());
✅ 场景:
当不能或不想修改实体类时非常有用。
class User {
String name;
int age;
}
List<User> users = ...;
users.sort(Comparator.comparingInt(u -> u.age));
✅ 场景:
users.sort(
Comparator
.comparing(User::getAge)
.thenComparing(User::getName)
);
✅ 场景:
Comparator.comparing(User::getAge).reversed();
或:
Comparator.comparingInt(User::getAge).reversed();
✅ 场景:
Comparator.nullsLast(Comparator.naturalOrder());
Comparator.nullsFirst(Comparator.naturalOrder());
✅ 场景:
NullPointerExceptionMap<String, Integer> map =
new TreeMap<>(Comparator.reverseOrder());
Set<User> set =
new TreeSet<>(Comparator.comparing(User::getName));
✅ 场景:
虽然不是直接用于分组,但常用于:
Map<Integer, List<User>> map =
users.stream()
.collect(Collectors.groupingBy(User::getAge));
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(...);
很多 Java API 接收 Comparator 作为参数:
Collections.sortArrays.sortPriorityQueue(优先级队列)PriorityQueue<Integer> heap =
new PriorityQueue<>(Comparator.reverseOrder());
✅ 场景:
| 场景 | 用谁 |
|---|---|
| 对象有“自然顺序” | Comparable |
| 多种排序规则 | Comparator |
| 不修改原类 | Comparator |
| 临时排序 | Comparator |
| 长期默认顺序 | Comparable |
只要“需要比较对象,但又不想或不能写死在类里”,就用
Comparator。
如果你有具体业务场景(如分页、报表、排序接口、SQL 替代方案),我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。