Comparator.comparing(Function.identity())本质是按对象自身自然顺序排序,要求类实现Comparable接口,等价于Comparator.naturalOrder();未实现时会抛ClassCastException。

用 Comparator.comparing 配合 Function.identity(),本质是让 Comparator 直接按对象自身(而不是某个字段)排序,前提是这个对象的类实现了 Comparable 接口。如果没实现,会抛 ClassCastException 或运行时异常。
什么时候用 Function.identity()?
当你想按对象“自然顺序”排序,且该类已定义好 compareTo() 逻辑时,比如 String、Integer、或你自己写的实现了 Comparable 的类。这时不需要提取字段,直接把对象本身传给比较器即可。
-
Function.identity()就是t -> t,返回参数本身 -
Comparator.comparing(Function.identity())等价于Comparator.naturalOrder() - 它不适用于未实现
Comparable的普通 POJO(如没重写compareTo的自定义类)
自定义类怎么配合使用?
必须让类实现 Comparable<YourClass>,并在 compareTo() 中定义排序规则。之后才能安全使用 Function.identity()。
例如:
立即学习“Java免费学习笔记(深入)”;
public class Person implements Comparable<Person> {
private String name;
private int age;
// 构造、getter 略
@Override
public int compareTo(Person o) {
int nameCmp = this.name.compareTo(o.name);
if (nameCmp != 0) return nameCmp;
return Integer.compare(this.age, o.age);
}
}
排序时:
List<Person> list = ...; list.sort(Comparator.comparing(Function.identity()));
效果等同于 list.sort(Comparator.naturalOrder()),按 name 主序、age 次序升序排列。
不实现 Comparable 怎么办?
如果类没实现 Comparable,又想用类似写法,就不能用 Function.identity(),而要明确指定排序依据:
- 按单个字段:
Comparator.comparing(p -> p.getName()) - 按多个字段:
Comparator.comparing(Person::getName).thenComparing(Person::getAge) - 反向排序:
Comparator.comparing(Person::getName).reversed()
强行对未实现 Comparable 的类调用 Function.identity(),会在运行时触发 ClassCastException(因为底层尝试强转为 Comparable)。
常见误区提醒
有人误以为 Function.identity() 能“自动推导”排序逻辑——它不能。它只是把对象原样传入,真正比较逻辑仍由对象自己的 compareTo() 提供。Java 不会根据字段名或类型自动决定怎么比。
- String、Integer 等 JDK 类可用,是因为它们本来就实现了
Comparable - Lombok 的
@Data不会自动生成compareTo,@Value也不等于可比较 - 若需快速生成
compareTo,可用 Lombok 的@EqualsAndHashCode+ 手动实现,或 IDE 生成


















