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

Java8 Comparator接口 和 List Steam 排序使用案例

在Java中,Comparator接口主要用于实现自定义排序逻辑,适用于未实现Comparable接口或需要覆盖默认比较规则的场景。以下是核心使用方法和注意事项:

一、基础用法

  1. 匿名内部类实现
    传统方式通过匿名内部类重写compare()方法,例如对整数降序排序:

    List<Integer> list = Arrays.asList(3, 1, 2); 
    list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) {// 降序 return o2 - o1; } } );

    此方式在Java 8之前常见。

  2. Lambda表达式简化
    Java 8后可用Lambda替代匿名类,代码更简洁:

    list.sort((o1, o2) -> o2 - o1);

    或使用方法引用:

    list.sort(Comparator.reverseOrder());

    适用于简单排序场景。

二、高级特性

  1. 多条件排序
    使用thenComparing()实现多级排序,例如先按年龄升序,再按姓名降序:

    List<Person> people = ...; 
    people.sort( Comparator.comparing(Person::getAge) .thenComparing(Comparator.comparing(Person::getName).reversed() ) );

    支持链式调用,灵活组合排序规则。

  2. 处理null值
    需显式处理null避免NullPointerException,例如将null排在末尾:

    list.sort((a, b) -> {if (a == null) return 1;if (b == null) return -1; return a.compareTo(b);});

    注意违反自反性会导致Comparison method violates its general contract错误。

三、Comparator与Comparable对比

维度ComparatorComparable
实现位置独立类或匿名类目标类内部实现
排序规则支持多种自定义规则仅提供单一自然排序
侵入性无侵入,不影响原有类需修改类结构
典型应用场景第三方类排序、多规则排序类自身有明确排序逻辑(如String)

优先使用Comparator实现灵活排序,尤其是需要动态调整规则时。

四、常见问题

  1. 整数溢出风险
    避免直接返回o1 - o2,应使用
    Integer.compare(o1, o2)。
  2. JDK8增强方法
    • Comparator.naturalOrder():自然排序
    • Comparator.nullsFirst():将null置于开头
    • Comparator.comparingInt():避免装箱开销68。

通过合理应用Comparator,可高效实现复杂排序需求,同时保持代码可维护性。

Java 8的 Stream API 提供了强大的List排序功能,主要通过sorted()方法实现,支持自然排序、自定义排序以及多条件组合排序。以下是核心用法总结:

1. 基础排序

  • 自然排序(升序)‌:直接调用sorted()方法,元素需实现Comparable接口
    list.stream().sorted().collect(Collectors.toList()); 
  • 降序排序‌:通过Comparator.reverseOrder()reversed()方法
    list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());// 或 
    list.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());

2. 自定义排序

  • 单字段排序‌:使用Comparator.comparing()指定字段
    list.stream().sorted(Comparator.comparing(Student::getScore)).collect(Collectors.toList());
  • 多字段排序‌:通过thenComparing()链式调用
    list.stream() .sorted(Comparator.comparing(Student::getAge)   .thenComparing(Student::getName)) .collect(Collectors.toList());

3. 空值处理

  • 空值优先/后置‌:使用Comparator.nullsFirst()Comparator.nullsLast()
    list.stream() .sorted(Comparator.comparing(Student::getAge,           Comparator.nullsFirst(Integer::compareTo))) .collect(Collectors.toList());

4. 性能提示

  • sorted()操作对大型流可能较昂贵,若数据已排序可跳过此操作2
  • 复杂排序建议预编译Comparator以减少重复计算9

完整示例:

List<Student> students = Arrays.asList( new Student("Alice", 25), new Student("Bob", 20) );List<Student> sorted = students.stream() .sorted(Comparator.comparing(Student::getAge).reversed()) .collect(Collectors.toList());
http://www.xdnf.cn/news/20239.html

相关文章:

  • 人工智能在医学图像中的应用:从机器学习到深度学习
  • 技术方案详解:如何安全移动已安装软件?
  • C语言精讲(视频教程)
  • 打包 Uniapp
  • Redisson分布式锁:看门狗机制与续期原理
  • nginx安装部署(备忘)
  • ecplise配置maven插件
  • 【知识点讲解】稀疏注意力与LSH技术:从基础到前沿的完整指南
  • MHA高可用架构
  • 多线程(六) ~ 定时器与锁
  • 驱动开发系列71 - GLSL编译器实现 - 指令选择
  • python 逻辑运算练习题
  • HttpClient、OkHttp 和 WebClient
  • 贪心算法应用:交易费优化问题详解
  • OpenLayers常用控件 -- 章节七:测量工具控件教程
  • 《sklearn机器学习——聚类性能指标》Fowlkes-Mallows 得分
  • Java学习笔记二(类)
  • 【3D图像算法技术】如何在Blender中对复杂物体进行有效减面?
  • 【EXPLAIN详解:MySQL查询优化师的显微镜】
  • MacOS 使用 luarocks+wrk+luajit
  • Docker 本地开发环境搭建(MySQL5.7 + Redis7 + Nginx + 达梦8)- Windows11 版 2.0
  • Mac Intel 芯片 Docker 一键部署 Neo4j 最新版本教程
  • 【Android 消息机制】Handler
  • PDF教程|如何把想要的网页保存下来?
  • docker 推送仓库(含搭建、代理等)
  • 服务器线程高占用定位方法
  • 使用 Shell 脚本监控服务器 IOWait 并发送邮件告警
  • Python带状态生成器完全指南:从基础到高并发系统设计
  • C#实现导入CSV数据到List<T>的完整教程
  • 【基础-单选】用哪一种装饰器修饰的struct表示该结构体具有组件化能力?