Java 列表排序:深入理解 Comparator.comparing 和降序排序!!!

Java 列表排序:深入理解 Comparator.comparing 和降序排序

在 Java 开发中,列表排序是常见操作,尤其在处理业务数据时。本文将深入探讨 resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo).reversed()); 的工作原理,结合实际案例,带你了解 Java 8 的强大功能! 我们将从代码解析到实际应用,包含表格总结、流程图、时序图和思维导图,助你全面掌握!


代码解析:它在做什么?

resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo).reversed()); 是一行优雅的 Java 8 代码,用于对 ListorderNo 字段进行降序排序。以下是逐步拆解:

  • resultList.sort(…): 调用 Listsort 方法,基于提供的 Comparator(比较器)对列表进行原地排序
  • Comparator.comparing(…): Java 8 引入的 Comparator(比较器)静态方法,通过提取 PaymentRecord 对象的 orderNo 字段(字符串)进行比较。
  • PaymentRecord::getOrderNo: 使用 方法引用(Method Reference),指向 PaymentRecord 类的 getOrderNo 方法,返回 orderNo(字符串)。
  • .reversed(): 反转比较器的顺序,将默认的升序(字典序)改为降序。

效果:列表中的 PaymentRecord 对象按 orderNo 字段的字典序降序排列(例如,“Z” > “A”,“9” > “1”)。


表格总结:关键概念一览

概念 描述 备注
List.sort List 接口的排序方法,基于 Comparator 原地排序 时间复杂度为 O(n log n),使用 Timsort 算法
Comparator.comparing 静态方法,基于键提取函数创建比较器 接受方法引用或 Lambda 表达式,简洁高效 ✨
PaymentRecord::getOrderNo 方法引用,返回 orderNo(字符串) 需确保 orderNonull,否则可能抛出 NPE(Null Pointer Exception,空指针异常) ⚠️
reversed() 反转比较器顺序,升序变降序 常用于自定义排序需求
字典序 字符串按字符 Unicode 值比较 例如,“CON20250521” > “CON20250513”

️ 实际案例:排序 PaymentRecord 列表

假设我们有一个 PaymentRecord 列表,包含以下 orderNo

  • CON20250513222415515-6832
  • CON20250521140707183-3701
  • CON20250513222655753-0679
  • CON20250513222544718-0381

使用以下代码进行降序排序:

resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo).reversed());

排序结果

  1. CON20250521140707183-3701
  2. CON20250513222655753-0679
  3. CON20250513222544718-0381
  4. CON20250513222415515-6832

解析reversed() 使字符串按字典序从大到小排列,21140707183(05月21日)排在最前,13222415515(05月13日 22:24:15)排在最后。✅


Mermaid 流程图:排序过程

以下是排序过程的 Mermaid 流程图,展示代码执行步骤,所有文本使用双引号包裹:

开始
创建 Comparator: Comparator.comparing(PaymentRecord::getOrderNo)
应用 reversed(),反转为降序
调用 resultList.sort(Comparator)
Timsort 算法比较 orderNo 字段
按字典序降序排列列表
返回排序后的 resultList
结束

说明

  • 创建 Comparator:通过 Comparator.comparing 提取 orderNo 字段。
  • 反转顺序reversed() 确保降序。
  • Timsort 算法:Java 的 List.sort 使用 Timsort(时间复杂度 O(n log n)),高效稳定。

⏳ 时序图:排序交互过程

以下是时序图,展示 PaymentRecordService 调用排序的交互过程,文本不加双引号:

调用者 PaymentRecordService List Comparator 调用 getAndProcessPaymentRecordsBySettlementId 创建 resultList (List) 创建 Comparator.comparing(PaymentRecord::getOrderNo) 返回比较器 调用 reversed() 返回降序比较器 调用 sort(Comparator) 返回排序后的 resultList 返回排序后的 PaymentRecord 列表 调用者 PaymentRecordService List Comparator

说明

  • 调用者:通常是控制器(Controller)或上层服务,触发排序。
  • PaymentRecordService:业务逻辑层,处理数据并调用排序。
  • List 和 Comparator:Java 集合框架和比较器,完成排序操作。

思维导图:总结知识点

以下是 Markdown 格式的思维导图,整理本文核心内容:

Java 列表排序:深入理解 Comparator.comparing 和降序排序!!!_第1张图片


⚠️ 注意事项

  1. 空值处理

    • 如果 orderNonull,可能抛出 NPE(Null Pointer Exception,空指针异常)。可使用以下代码安全处理:
      resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo, Comparator.nullsLast(Comparator.naturalOrder())).reversed());
      
      这将 null 值放在列表末尾。️
  2. 性能考虑

    • List.sort 使用 Timsort 算法,时间复杂度为 O(n log n),适合大多数场景。
    • 对于超大列表,可考虑并行排序(如 parallelSort),但需注意线程安全。⚡
  3. 扩展性

    • 如果需要多字段排序,可以链式调用 thenComparing
      resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo)
                       .thenComparing(PaymentRecord::getTotalAmount)
                       .reversed());
      
      这将先按 orderNo 降序,再按 totalAmount 降序。

总结

通过 resultList.sort(Comparator.comparing(PaymentRecord::getOrderNo).reversed());,我们利用 Java 8 的函数式编程特性,实现了一个简洁高效的降序排序。结合表格、流程图、时序图和思维导图,我们深入剖析了其原理和应用场景。希望这篇博客能帮助你更好地理解 Java 排序机制! 有问题欢迎留言讨论!

你可能感兴趣的:(产品资质管理系统,java,算法,开发语言)