Java 8+ 排序API实战:Arrays.sort() 与 Collections.sort() 的3种自定义比较器写法 📅 发布时间:2026/7/11 8:15:41 👁️ 浏览次数: Java 8 排序API实战Arrays.sort() 与 Collections.sort() 的3种自定义比较器写法在算法竞赛和日常开发中排序是最基础也最频繁使用的操作之一。Java从早期版本就提供了Arrays.sort()和Collections.sort()这两个核心排序方法但直到Java 8引入函数式编程特性后自定义排序规则的写法才真正变得简洁优雅。本文将深入探讨三种现代写法并通过实际案例展示如何应对多级排序等复杂场景。1. 排序基础与核心概念在Java中Arrays.sort()用于数组排序Collections.sort()用于集合排序两者都支持通过自定义比较器Comparator来指定排序规则。理解以下核心概念对掌握排序API至关重要自然排序通过实现Comparable接口的compareTo方法定义对象默认排序规则定制排序通过Comparator实现类定义灵活的、临时的排序规则稳定性相等元素的相对位置在排序后是否保持不变Java的排序算法是稳定的传统写法使用匿名内部类实现Comparator而Java 8之后我们可以用更简洁的Lambda表达式和方法引用来实现相同功能。下面是一个简单对比// 传统写法匿名内部类 Arrays.sort(students, new ComparatorStudent() { Override public int compare(Student s1, Student s2) { return s1.getScore() - s2.getScore(); } }); // Java 8写法Lambda表达式 Arrays.sort(students, (s1, s2) - s1.getScore() - s2.getScore());2. 三种现代比较器写法详解2.1 Lambda表达式写法Lambda表达式是Java 8最显著的特性之一它极大简化了Comparator的实现。基本语法为(参数1, 参数2) - 表达式实际应用示例// 按分数升序排序 Collections.sort(students, (s1, s2) - s1.getScore() - s2.getScore()); // 按姓名字典序排序 Arrays.sort(students, (s1, s2) - s1.getName().compareTo(s2.getName()));提示当比较数值类型时直接相减可能导致整数溢出。更安全的写法是使用Integer.compare(a, b)或Double.compare(a, b)2.2 方法引用写法当排序依据是对象的某个属性时可以使用方法引用进一步简化代码。Comparator.comparing()静态方法是这种写法的核心// 按分数排序 Collections.sort(students, Comparator.comparing(Student::getScore)); // 按姓名排序 Arrays.sort(students, Comparator.comparing(Student::getName));方法引用不仅更简洁而且可读性更强。Comparator.comparing()还支持链式调用方便实现多级排序// 先按班级升序再按分数降序 Arrays.sort(students, Comparator.comparing(Student::getClassId) .thenComparing(Student::getScore, Comparator.reverseOrder()) );2.3 组合比较器写法对于复杂排序需求Java 8提供了组合多个比较器的方法。常用的组合操作包括thenComparing()当前比较结果相等时使用下一个比较器reversed()反转当前比较器的顺序nullsFirst()/nullsLast()处理null值的情况示例代码// 多级排序先按部门再按入职时间最后按工资降序 ListEmployee employees ...; employees.sort( Comparator.comparing(Employee::getDepartment) .thenComparing(Employee::getHireDate) .thenComparing(Employee::getSalary, Comparator.reverseOrder()) ); // 处理可能为null的属性 ListOptionalString names ...; names.sort(Comparator.nullsFirst(Comparator.naturalOrder()));3. 实战多级排序解决方案算法竞赛和实际业务中经常遇到需要多级排序的场景。下面通过两个典型案例展示解决方案。3.1 学生成绩排序案例假设需要先按总分降序排序总分相同则按语文成绩降序最后按学号升序class Student { int id; int chinese; int math; int english; public int getTotal() { return chinese math english; } } ListStudent students ...; students.sort( Comparator.comparingInt(Student::getTotal).reversed() .thenComparingInt(Student::getChinese).reversed() .thenComparingInt(Student::getId) );3.2 电商商品排序案例电商平台常见的多维度排序需求class Product { String category; double price; double rating; LocalDate createTime; } ListProduct products ...; products.sort( Comparator.comparing(Product::getCategory) .thenComparing(Product::getPrice) .thenComparing(Product::getRating, Comparator.reverseOrder()) .thenComparing(Product::getCreateTime, Comparator.reverseOrder()) );4. 性能优化与注意事项虽然现代API写法简洁但在性能敏感场景仍需注意以下要点避免频繁创建比较器对于重复使用的比较器应该缓存实例考虑排序稳定性稳定排序算法在多次排序时能保持之前的相对顺序注意装箱开销对基本类型使用专门的方法如comparingInt()、thenComparingInt()等性能对比示例// 有装箱开销的写法 ComparatorStudent c1 Comparator.comparing(s - s.getScore()); // 无装箱开销的优化写法 ComparatorStudent c2 Comparator.comparingInt(Student::getScore);对于大规模数据排序还可以考虑并行排序// 并行排序数组 Arrays.parallelSort(largeArray); // 并行排序集合 ListStudent largeList ...; largeList.parallelStream() .sorted(Comparator.comparing(Student::getScore)) .collect(Collectors.toList());在实际项目中合理选择排序方法和比较器写法能显著提升代码的可维护性和执行效率。
Linux打开xclock显示can‘t display的问题 确保DISPLAY变量正确配置。对于本地显示: export DISPLAY:0.0(针对于本地) 如果是远程访问: export DISPLAY192.168.1.2:0.0(192.168.1.2为远程访问机器的地址,如使用192.168.1.2访问192.168.1.100,是用… 2026/7/11 8:13:41
RTSP 与 RTP/RTCP 实战联调:Wireshark 抓包解析 5 个关键交互阶段 RTSP 与 RTP/RTCP 全链路抓包解析:从信令交互到媒体传输的实战指南1. 流媒体协议栈的协同架构在实时音视频系统中,RTSP、RTP、RTCP 构成了完整的传输控制体系。三者的分工如下:RTSP:作为应用层控制协议,负责媒体会话的… 2026/7/11 8:11:40
高精度ADC设计:ADS131M02与PIC18F47Q10在工业测量中的应用 1. 项目背景与核心器件选型在工业测量和电能计量领域,高精度模数转换器(ADC)的设计一直是硬件工程师面临的挑战。ADS131M02作为德州仪器(TI)推出的24位Δ-Σ ADC,以其同步采样、低功耗和优异的噪声性能成为众多设计中的首选。当与Microchip的PIC18F47Q10… 2026/7/11 8:11:40
Supabase Auth + Cursor Context-aware Coding(上下文感知编码)实战:1个.env配置解锁RBAC权限驱动的AI提示工程 更多请点击: https://kaifayun.com 第一章:Supabase Auth与Cursor Context-aware Coding融合架构概览 Supabase Auth 为现代全栈应用提供了开箱即用的用户认证能力,涵盖邮箱密码、OAuth 2.0(如 GitHub、Google)、短信… 2026/7/11 9:58:14
PCA、LDA、t-SNE 降维实战:Iris 数据集 3 种方法可视化效果对比 PCA、LDA与t-SNE降维实战:Iris数据集三维可视化深度解析1. 降维技术的核心价值与应用场景当我们面对高维数据时,常常会陷入"维度灾难"的困境——随着维度增加,数据稀疏性呈指数级增长,计算复杂度急剧上升,而… 2026/7/11 9:58:14
MiniMax多模态AI技术在国际峰会亮相与开发者实践指南 1. 为什么AI公司都在抢滩国际科技峰会? 最近科技圈有个现象值得关注:国内AI公司纷纷亮相国际顶级科技峰会。从Google I/O到微软Build,再到即将到来的巴黎RAISE Week,中国AI企业的身影越来越活跃。这背后反映的不仅是技术实力的展示… 2026/7/11 9:56:13
电容/电感元件VCR与串并联:3种等效计算对比,避免电路分析混淆 电容与电感元件VCR及串并联计算:3种等效方法对比与典型误区解析在电路设计与分析中,电容和电感作为核心动态元件,其伏安关系(VCR)与串并联等效计算是构建复杂电路模型的基础。许多工程师在从理论学习转向实际应用时,常因混淆两类元… 2026/7/11 9:56:13
Sonnet 4.6:面向现代软件工程的高性价比代码操作员 1. 这不是小升级,是开发工作流的临界点突破昨天晚上十一点半,我正调试一个卡了三天的微服务链路追踪问题,顺手刷了下 Anthropic 的官方博客更新——看到标题里“Sonnet 4.6”和“OSWorld 72.5%”并列出现时,我下意识点了刷新键&am… 2026/7/11 9:54:13
ModTheSpire终极指南:3步轻松扩展《杀戮尖塔》游戏体验 ModTheSpire终极指南:3步轻松扩展《杀戮尖塔》游戏体验 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire是一款专为《杀戮尖塔》设计的开源模组加载器࿰… 2026/7/11 9:54:13
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08