当前位置: 首页 > article >正文

Java List排序:Comparable与Comparator接口及Stream API应用

在 Java 编程中,集合(List)元素排序是常见需求。本文将解读使用 Comparable 接口、Comparator 接口及 JDK 8 的 Stream API 对 List 进行高效排序,并通过实例代码演示用法和区别。
在这里插入图片描述

Comparable接口

原理与应用
java.lang.Comparable是 Java 标记型接口,定义了compareTo(T o)方法,实现该接口的类可进行比较排序,像 Integer、String 等内置类型已实现,它确定了自然排序规则

public interface Comparable<T> {
    int compareTo(T o);
}

我们创建了一个Person类并实现Comparable接口,指定按照年龄排序,当你调用Collections.sort()对Person对象列表进行排序时,无需额外提供排序规则,因为Person类自身已经定义了如何与其他Person对象进行比较。

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 构造函数,getters, setters...

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

List<Person> people = ...; // 初始化人员列表
Collections.sort(people); // 这里调用sort时,会自动使用Person类中定义的compareTo方法进行排序

Comparator接口

原理与应用
java.util.Comparator 是另一个接口,它也提供了比较两个对象的方法,但是它的比较逻辑是外在的,不依赖于被比较对象本身的实现,它可以为任何类提供多种不同的排序策略。

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

我们可能需按姓名或年龄对 Person 对象排序,可创建两个不同 Comparator,同一个 Person 类可依不同 Comparator 产生不同排序结果,这是外部排序的灵活性

import java.util.Comparator;

public class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}

public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

// 使用:
List<Person> people = ...;
Collections.sort(people, new AgeComparator()); // 按年龄排序
Collections.sort(people, new NameComparator()); // 按姓名排序

Stream API中的排序

Java 8 的 Stream API 引入了链式编程风格,sorted()方法可用于对流元素排序,能接受Comparator参数,若元素类型已实现Comparable接口,可直接调用sorted()无需传参

List<Person> people = Arrays.asList(...); // 初始化人员列表

// 使用Stream API和lambda表达式按年龄排序
List<Person> sortedByAge = people.stream()
    .sorted(Comparator.comparing(Person::getAge)) // 使用方法引用简化代码
    .collect(Collectors.toList());

// 或者直接在原始list上排序(不创建新的list)
people.sort(Comparator.comparing(Person::getAge));

区别总结

  • Comparable:内部排序,适用于有固有排序逻辑的实体,在类中实现接口进行内部排序。
  • Comparator:外部排序,更灵活,可按需动态指定或切换排序规则,创建实现类进行外部排序。
  • Stream API 排序:结合 Lambda 表达式简化代码、增强可读性,可链式操作,利用sorted()方法配合 Lambda 表达式或 Comparator 对集合元素排序并与其他流操作结合。

What is Java technology and why do I need it?
Java is a programming language and computing platform first released by Sun Microsystems in 1995. It has evolved from humble beginnings to power a large share of today’s digital world, by providing the reliable platform upon which many services and applications are built. New, innovative products and digital services designed for the future continue to rely on Java, as well.

While most modern Java applications combine the Java runtime and application together, there are still many applications and even some websites that will not function unless you have a desktop Java installed. Java.com, this website, is intended for consumers who may still require Java for their desktop applications – specifically applications targeting Java 8. Developers as well as users that would like to learn Java programming should visit the dev.java website instead and business users should visit oracle.com/java for more information.

Is Java free to download?
Yes, Java is free to download for personal use.
Java is also free for development: developers can find all the development kits and other useful tools at https://www.oracle.com/javadownload/.

Why should I upgrade to the latest Java patch each quarter when prompted?
The latest Java patches contain important enhancements to improve performance, stability and security of the Java applications that run on your machine. Installing these updates will ensure that your Java applications continue to run with the most up-to-date version.


http://www.kler.cn/a/505329.html

相关文章:

  • 【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)
  • istio-proxy oom问题排查步骤
  • 2025宝塔API一键建站系统PHP源码
  • wordpress 房产网站筛选功能
  • dockerfile2.0
  • Android string.xml中特殊字符转义
  • Eclipse 视图(View)
  • (蓝桥杯)使用前缀和与二分查找解决子数组和问题——不太甜的糖果
  • 【深度学习实战】kaggle 自动驾驶的假场景分类
  • Unity3D实现加载.abc动画模型
  • Postman接口自动化测试:批量参数化(参数文件)
  • 高通骁龙8 Elite 2性能综合测评
  • 【0391】Postgres内核 checkpointer process ① 启动初始化
  • 晨辉面试抽签和评分管理系统之八:随机编排考生的面试批次(以教师资格考试面试为例)
  • 人狗大战 Java新实现,更有趣,Java _Springboot_Spring AI
  • 深度解析 React 中 setState 的原理:同步与异步的交织
  • 前端实现doc文件预览的三种方式
  • TouchGFX学习笔记(一)
  • 微信小程序 实现拼图功能
  • OpenCV相机标定与3D重建(59)用于立体相机标定的函数stereoCalibrate()的使用
  • EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测
  • 利用 Java 爬虫获取 1688 商品评论的实践指南
  • Pytorch基础教程:从零实现手写数字分类
  • Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
  • Azure Synapse Dedicated SQL Pool执行计划的步骤对应于查询优化器执行给定SQL查询的部分和优化策略
  • 【JVM-7】JVM 命令行工具 jstack 的使用和具体应用案例