Comparator是Java中用于自定义排序规则的函数式接口,通过compare方法定义对象间的比较逻辑,支持多条件排序、倒序及null值处理,结合Lambda和Stream API可灵活实现复杂排序需求。
在Java中,当我们需要对对象进行排序时,仅靠默认的自然排序(Comparable接口)往往不够灵活。这时就可以使用Comparator接口来自定义比较规则。它允许我们根据对象的任意属性或复杂逻辑进行排序,而无需修改类本身的结构。
Comparator是java.util包中的一个函数式接口,定义了两个方法:compare(T o1, T o2)和equals(Object obj)。我们主要关注compare方法:
通过实现这个接口,我们可以为集合中的对象指定排序方式。
假设
有一个Person类,包含姓名和年龄属性:
现在想按年龄排序,可以这样写Comparator:
Comparator然后用于List排序:
List由于Comparator是函数式接口,可以用Lambda简化:
people.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));或者更简洁地使用方法引用:
people.sort(Comparator.comparing(Person::getAge));如果要倒序,调用reversed():
people.sort(Comparator.comparing(Person::getAge).reversed());多条件排序也容易实现:
people.sort(Comparator.comparing(Person::getName) .thenComparing(Person::getAge));Comparator接口提供了一些有用的静态方法:
例如处理可能为空的对象:
people.sort(Comparator.nullsLast(Comparator.comparing(Person::getName)));基本上就这些。掌握Comparator能让我们灵活控制对象排序逻辑,结合Lambda和Stream API使用尤其方便。不复杂但容易忽略的是null值处理和复合排序场景,建议实际编码中多加注意。