Java 1.8 Comparator 比较函数式接口

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

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

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

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1800+ 小伙伴加入学习 ,欢迎点击围观

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 接口,我们可以轻松地实现自定义的排序规则,并在集合排序、搜索等场景中使用。