Java 1.8 Comparator 比较函数式接口

更新时间 2023-07-18 22:09:34

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 1v1 提问 / 学习打卡 / 每月赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目2期已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 288 小节,累计 45w+ 字,讲解图:2012 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1600+ 小伙伴加入,欢迎点击围观

Comparator 接口常用于比较操作,它在集合排序、搜索、自定义排序等场景中提供了灵活的比较策略。

本教程将深入介绍 Java 1.8 中的 Comparator 接口,并通过示例代码演示如何使用它。

Comparator 接口概览

java.util 包中,Comparator 接口定义如下:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}
  • T 表示待比较对象的类型。
  • compare(T o1, T o2) 是 Comparator 接口中唯一的抽象方法,用于比较两个对象 o1 和 o2 的顺序。

Comparator 接口是一个泛型接口,它可以用于比较不同类型的对象。

使用 Comparator 接口

让我们通过几个示例来说明如何使用 Comparator 接口。

示例 1:对整数列表排序

创建一个 Comparator 对象,用于对整数列表进行排序。

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);

Comparator<Integer> ascendingOrder = (a, b) -> a - b;
numbers.sort(ascendingOrder);

System.out.println("Ascending order: " + numbers); // 输出 "Ascending order: [1, 2, 3, 5, 8]"

在这个例子中,我们创建了一个 Comparator 对象 ascendingOrder,它表示按照升序排序。我们使用 sort() 方法对整数列表进行排序,使用 compare() 方法来比较整数的顺序,并输出升序排序结果。

示例 2:对字符串列表排序

使用 Comparator 接口对字符串列表进行排序。

List<String> fruits = Arrays.asList("apple", "orange", "banana", "grape");

Comparator<String> descendingOrder = (a, b) -> b.compareTo(a);
fruits.sort(descendingOrder);

System.out.println("Descending order: " + fruits); // 输出 "Descending order: [orange, grape, banana, apple]"

在这个例子中,我们创建了一个 Comparator 对象 descendingOrder,它表示按照降序排序。我们使用 sort() 方法对字符串列表进行排序,使用 compare() 方法来比较字符串的顺序,并输出降序排序结果。

示例 3:自定义对象排序

使用 Comparator 接口对自定义对象进行排序。

class Student {
    private String name;
    private int age;

    // 构造函数和其他方法

    // Getter 和 Setter 方法

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

List<Student> students = Arrays.asList(
        new Student("Alice", 20),
        new Student("Bob", 18),
        new Student("Charlie", 22)
);

Comparator<Student> sortByAge = (s1, s2) -> s1.getAge() - s2.getAge();
students.sort(sortByAge);

System.out.println("Students sorted by age: " + students);

在这个例子中,我们创建了一个 Student 类,并在其中实现了 Comparable 接口。然后,我们创建了一个 Comparator 对象 sortByAge,它表示按照年龄进行排序。我们使用 sort() 方法对学生列表进行排序,使用 compare() 方法来比较学生对象的顺序,并输出按年龄排序的结果。

总结

Java 1.8 中的 Comparator 接口为比较对象顺序提供了灵活的策略。通过使用 Comparator 接口,我们可以轻松地实现自定义的排序规则,并在集合排序、搜索等场景中使用。