Comparator(比较器)定义
Comparator 【 美 /ˈkɑːmpəˌreɪtər; kəmˈpærətər/】
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
....
}
自己总结
# Compares its two arguments (o1,o2) for order,Returns a integer。
# 当返回的integer < 0 表示 o1<o2
# 当返回的integer = 0 表示 o1=o2
# 当返回的integer > 0 表示 o1>o2
# 顺序相同就升序
students.sort((o1, o2) -> o1.getScore() - o2.getScore()); 升序
(a, b) -> a.compareTo(b) 升序
(a, b) -> a.getName().compareTo(b.getName()) 升序
(a, b) -> a - b 升序
# 顺序相反就降序
students.sort((o1, o2) -> o2.getScore() - o1.getScore()); 降序
(a, b) -> b.compareTo(a) 降序
接口实现方式
方式1・传统方式
# 方式1・传统方式
Comparator<Integer> consumer = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
Comparator<Integer> consumer =new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 先按照年龄升序
Integer i = o1.getAge().compareTo(o2.getAge());
if (i == 0) {
// 如果年龄相等,则按照分数升序
i = o1.getScore().compareTo(o2.getScore());
if (i == 0) {
// 如果分数相等,则按照姓名升序
i = o1.getName().compareTo(o2.getName());
}
}
return i;
}
}
# 使用Demo
List<Integer> list = List.of(1, 6, 3, 5, 6, 3, 2, 8);
List<Integer> collect = list.stream().sorted(consumer).toList(); // [1, 2, 3, 3, 5, 6, 6, 8]
方式2・lambda表达式
# 方式2・lambda表达式
(a, b) -> a - b
(a, b) -> a.compareTo(b)
(a, b) -> a.getName().compareTo(b.getName())
(o1, o2) -> {
// 先按照年龄升序
Integer i = o1.getAge().compareTo(o2.getAge());
if (i == 0) {
// 如果年龄相等,则按照分数升序
i = o1.getScore().compareTo(o2.getScore());
if (i == 0) {
// 如果分数相等,则按照姓名升序
i = o1.getName().compareTo(o2.getName());
}
}
return i;
}
# 使用Demo
List<Integer> list1 = List.of(1, 6, 3, 5, 6, 3, 2, 8);
List<Integer> integers = list1.stream().sorted((o1, o2) -> o2 - o1).toList(); // [8, 6, 6, 5, 3, 3, 2, 1]
方式3・Comparator工厂方法
# 方式3・Comparator工厂方法
Comparator<T> comparator = Comparator.naturalOrder(); // 升序
Comparator<T> comparator = Comparator.reverseOrder(); // 降序
Comparator<Student> comparator = Comparator.comparing(e -> e.getUsername());
Comparator<Student> comparator = Comparator.comparing(Student::getUsername);
Comparator<Student> comparator = Comparator.comparingInt(Student::getAge);
# 使用Demo
List<Integer> list1 = List.of(1, 6, 3, 5, 6, 3, 2, 8);
List<Integer> integers = list1.stream().sorted(Comparator.reverseOrder()).toList(); // [8, 6, 6, 5, 3, 3, 2, 1]