Comparator接口是Java中用于自定义排序的函数式接口,通过实现compare方法定义排序规则;可使用匿名类、Lambda表达式或方法引用对对象列表进行排序,如按年龄升序Comparator.comparing(Person::getAge);支持链式调用thenComparing实现多级排序,以及reversed()进行逆序排列,使对象排序灵活且代码简洁。

在Java中,Comparator 接口是实现自定义排序的核心工具之一。它允许你为对象集合定义灵活的排序规则,尤其适用于无法修改类本身或需要多种排序方式的场景。
什么是Comparator接口?
Comparator 是 java.util 包中的一个函数式接口,包含一个抽象方法 int compare(T o1, T o2)。该方法比较两个对象并返回:
- 负数:表示 o1 小于 o2
- 0:表示两者相等
- 正数:表示 o1 大于 o2
通过实现这个方法,你可以控制排序逻辑。
如何对对象列表进行自定义排序
假设有一个 Person 类,包含姓名和年龄属性:
立即学习“Java免费学习笔记(深入)”;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter 方法(可选)
public String getName() { return name; }
public int getAge() { return age; }
public String toString() {
return name + "(" + age + ")";
}
}
现在想按年龄升序排列 Person 列表,可以创建一个 Comparator 实现:
import java.util.*; Listpeople = Arrays.asList( new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35) ); people.sort(new Comparator () { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getAge()); } });
输出结果将是按年龄从小到大排序:[Bob(25), Alice(30), Charlie(35)]
使用Lambda表达式简化代码
由于 Comparator 是函数式接口,可以用 Lambda 表达式替代匿名类:
people.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
甚至更简洁地使用方法引用:
people.sort(Comparator.comparing(Person::getAge));
如果要按姓名排序:
people.sort(Comparator.comparing(Person::getName));
组合多个排序条件
可以链式调用 thenComparing 实现多级排序。例如先按年龄升序,再按姓名字母顺序:
people.sort(Comparator.comparing(Person::getAge)
.thenComparing(Person::getName));
支持逆序排列,比如按年龄降序:
people.sort(Comparator.comparing(Person::getAge).reversed());
基本上就这些。使用 Comparator 能让你在不改变类定义的情况下,灵活地对对象进行各种排序操作,结合 Lambda 和流式 API 后代码更加简洁清晰。










