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()
,但专门用于基本类型 int
、long
和 double
。这些方法可以避免自动装箱的开销,性能会更好。
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
类型的年龄进行排序。