在 Java 中,自定义 Comparator 通常用于对集合(如 List、TreeSet、TreeMap 等)按自定义规则排序。下面从基础到进阶系统讲一下。
Comparator<T> 是一个函数式接口,只有一个核心方法:
int compare(T o1, T o2);
返回值含义:
List<Integer> list = Arrays.asList(5, 2, 9, 1);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a - b; // 升序
}
});
list.sort((a, b) -> a - b);
或:
list.sort(Comparator.comparingInt(a -> a));
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
List<Student> students = Arrays.asList(
new Student("Tom", 20),
new Student("Jerry", 18)
);
students.sort((s1, s2) -> s1.age - s2.age);
Comparator.comparing(最优雅)students.sort(Comparator.comparing(s -> s.age));
或:
students.sort(Comparator.comparing(Student::getAge));
students.sort(Comparator.comparing(Student::getAge).reversed());
先按 age 升序,再按 name 降序:
students.sort(
Comparator
.comparing(Student::getAge)
.thenComparing(
Comparator.comparing(Student::getName).reversed()
)
);
students.sort(
Comparator.nullsLast(Comparator.comparing(Student::getAge))
);
nullsFirst:null 排最前nullsLast:null 排最后Set<Student> set = new TreeSet<>(
Comparator.comparing(Student::getAge)
);
Map<Student, String> map = new TreeMap<>(
Comparator.comparing(Student::getName)
);
❌ 错误写法(可能溢出):
return a - b;
✅ 正确写法:
return Integer.compare(a, b);
| 场景 | 推荐方式 |
|---|---|
| 简单排序 | lambda |
| 对象排序 | Comparator.comparing |
| 多条件 | thenComparing |
| 倒序 | reversed() |
| 空值安全 | nullsFirst / nullsLast |
如果你有具体对象或业务场景(比如日期、字符串、嵌套对象),可以直接贴代码,我可以帮你写最合适的 Comparator。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。