Comparator.comparingThen
时间: 2023-11-21 10:56:21 浏览: 57
根据提供的引用内容,Java 8中的Comparator接口提供了一个comparingThen方法,它可以用于对对象进行排序。该方法接受一个Function参数,该参数将对象映射到可比较的键。然后,它返回一个比较器,该比较器首先按照指定的键进行比较,然后按照指定的比较器进行比较。
以下是一个使用comparingThen方法的例子,假设我们有一个Employee类,该类具有name和age属性:
```java
List<Employee> employees = new ArrayList<>();
employees.add(new Employee("John", 25));
employees.add(new Employee("Jane", 30));
employees.add(new Employee("Adam", 20));
// 按照年龄升序排序,如果年龄相同则按照姓名降序排序
Comparator<Employee> comparator = Comparator.comparing(Employee::getAge)
.thenComparing(Comparator.comparing(Employee::getName).reversed());
Collections.sort(employees, comparator);
```
在上面的例子中,我们首先按照年龄升序排序,然后使用thenComparing方法按照姓名进行排序。由于我们想要按照姓名的降序排序,因此我们使用了reversed方法。
相关问题
.sorted(Comparator.comparing(ModeValue::getValue, Comparator.nullsLast(Comparator.reverseOrder()))) 排序 失效
可能是因为 ModeValue 类没有实现 Comparable 接口,或者 Comparator.comparing() 方法中的比较器逻辑有误。请检查一下 ModeValue 类的定义和 Comparator 的使用。
如果 ModeValue 类没有实现 Comparable 接口,可以尝试在 Comparator.comparing() 方法中传入一个实现了 Comparator 接口的比较器对象,例如:
.sorted(Comparator.comparing(ModeValue::getValue, Comparator.nullsLast(Comparator.reverseOrder())))
改为:
.sorted(Comparator.comparing(ModeValue::getValue, Comparator.nullsLast((o1, o2) -> {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null) {
return 1;
}
if (o2 == null) {
return -1;
}
return o2.compareTo(o1);
})))
其中,Lambda 表达式中的比较器逻辑是:如果 o1 和 o2 都为 null,则返回 0;如果 o1 为 null,则 o2 大于 o1,返回 1;如果 o2 为 null,则 o1 大于 o2,返回 -1;否则,比较 o1 和 o2 的大小。
Comparator.comparingLong Comparator.reversed
### Java Comparator `comparingLong` 和 `reversed` 的用法及区别
#### 使用场景
当处理数值类型的比较时,尤其是基本数据类型如 long 类型的数据,可以利用 `Comparator.comparingLong()` 方法来简化代码并提高性能。此方法允许直接传递一个提取键的函数作为参数[^1]。
对于需要反转排序顺序的情况,则可采用 `Comparator.reversed()` 来轻松改变已有比较器的行为方向。该特性使得开发者能够灵活调整列表或其他集合内元素排列的方式而无需重新定义整个比较逻辑[^2]。
#### 语法说明
- **`comparingLong`**: 接受一个返回 Long 值的方法引用或 lambda 表达式,并基于这些值创建一个新的 Comparator 实例。
```java
public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
```
- **`reversed`**: 返回当前 comparator 对象的一个新实例,其自然排序被颠倒过来。
```java
default Comparator<T> reversed()
```
#### 示例代码展示
下面通过具体例子对比两者之间的差异:
```java
import java.util.*;
import java.util.function.*;
class Example {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
// 正序按年龄升序排列
Collections.sort(people, Comparator.comparingLong(Person::getAge));
System.out.println("Sorted by age ascending:");
people.forEach(System.out::println);
// 反转之前的排序结果变为降序
Collections.sort(people, Comparator.comparingLong(Person::getAge).reversed());
System.out.println("\nReversed order (age descending):");
people.forEach(System.out::println);
}
}
class Person {
private String name;
private long age;
public Person(String name, long age) {
this.name = name;
this.age = age;
}
public long getAge() { return age; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
```
上述程序先按照人的年龄从小到大进行了正向排序;接着再调用了 `.reversed()` 将之前的结果翻转为了从大至小显示。
阅读全文