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

Java 8 中引入的 Comparator 工具方法

Java 8 中引入的 Comparator 工具方法极大地增强了集合排序的灵活性和简洁性:

  • comparing():基于对象属性生成比较器。
  • thenComparing():多重排序。
  • reversed():反转排序顺序。
  • nullsFirst() / nullsLast():处理 null 值排序。
  • naturalOrder() / reverseOrder():自然顺序与逆自然顺序。
  • comparingInt()comparingLong()comparingDouble():高效处理基本类型。

      • 1. `comparing()` 方法
      • 2. `thenComparing()` 方法
      • 3. `reversed()` 方法
      • 4. `nullsFirst()` 和 `nullsLast()` 方法
      • 5. `naturalOrder()` 和 `reverseOrder()` 方法
      • 6. `comparingInt()`, `comparingLong()`, 和 `comparingDouble()`


1. comparing() 方法

Comparator.comparing() 是一个静态方法,通常用于基于特定属性生成 Comparator。它接受一个用于提取键值的函数(keyExtractor),并返回一个比较器。

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Charlie", 35)
);

// 使用 Comparator.comparing 按年龄排序
people.sort(Comparator.comparing(Person::getAge));

2. thenComparing() 方法

thenComparing() 方法用于组合多个 Comparator,实现多重排序。它是在前一个比较器相等的情况下,使用第二个比较器进行进一步的排序。

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Alice", 25)
);

// 首先按名字排序,其次按年龄排序
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));

3. reversed() 方法

reversed() 方法用于反转比较器的顺序。它可以让你轻松地实现降序排序。

// 按年龄降序排序
people.sort(Comparator.comparing(Person::getAge).reversed());

在上面的代码中,Comparator.comparing(Person::getAge) 创建了一个升序比较器,reversed() 将其转换为降序比较器。


4. nullsFirst()nullsLast() 方法

nullsFirst()nullsLast() 是用于处理 null 值的工具方法。它们可以指定 null 值在排序中的位置:要么优先于非空值(nullsFirst()),要么在非空值之后(nullsLast())。

示例:

List<String> names = Arrays.asList("Alice", null, "Bob", "Charlie");

// 将 null 值放在最前面
names.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
// 输出: [null, Alice, Bob, Charlie]

// 将 null 值放在最后面
names.sort(Comparator.nullsLast(Comparator.naturalOrder()));
// 输出: [Alice, Bob, Charlie, null]

5. naturalOrder()reverseOrder() 方法

Comparator.naturalOrder() 返回一个自然顺序的比较器,这通常用于排序可比较的对象(即实现了 Comparable 接口的对象)。Comparator.reverseOrder() 则返回一个与自然顺序相反的比较器。

List<Integer> numbers = Arrays.asList(3, 5, 1, 4, 2);

// 自然顺序排序
numbers.sort(Comparator.naturalOrder());
// 输出: [1, 2, 3, 4, 5]

// 逆自然顺序排序
numbers.sort(Comparator.reverseOrder());
// 输出: [5, 4, 3, 2, 1]

Comparator.naturalOrder() 用于升序排列,而 reverseOrder() 则用于降序排列。


6. comparingInt(), comparingLong(), 和 comparingDouble()

comparingInt()comparingLong()comparingDouble() 这几个静态方法类似于 comparing(),但专门用于基本类型 intlongdouble。这些方法可以避免自动装箱的开销,性能会更好。

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Charlie", 35)
);

// 使用 comparingInt 按年龄排序
people.sort(Comparator.comparingInt(Person::getAge));

Comparator.comparingInt(Person::getAge) 创建了一个比较器用于按 int 类型的年龄进行排序。


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

相关文章:

  • 单臂路由技术,eNSP实验讲解
  • 黑马官网2024最新前端就业课V8.5笔记---HTML篇
  • js WebAPI黑马笔记(万字速通)
  • WindowsDocker安装到D盘,C盘太占用空间了。
  • python NLTK快速入门
  • 【双指针】【数之和】 LeetCode 633.平方数之和
  • C++:unordered_set、unordered_map类
  • Spring Cloud数据库从MySQL切换到OceanBase
  • redis缓存雪崩、击穿、穿透
  • 江协科技STM32学习- P36 SPI通信外设
  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • Chrome 130 版本新特性 Chrome 130 版本发行说明
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(2)
  • ORA-00020和ORA-00603报错处理
  • Linux高阶——1103——Signal信号机制
  • 【Stable Diffusion】
  • 家具组装行业产品说明书的创新与优化
  • 鸿蒙笔记--tsets
  • 探索 Move 编程语言:智能合约开发的新纪元
  • CSRF初级靶场
  • 文件操作:使用ByteArrayInputStream
  • A010-基于SpringBoot的宠物健康咨询系统的设计与实现
  • 【LeetCode】【算法】739. 每日温度
  • Harmony项目基础
  • 基于 RNN 的语言模型
  • windows 文件监控 c++ 11及以上版本可用