使用 comparator.comparing() 链式调用配合 .thencomparing() 可以实现多条件排序。只需在初始比较器后追加后续字段,即可按优先级依次处理相等情况,代码简洁且无需手动编写匿名内部类。

如何指定降序排列
通过 Comparator.reverseOrder() 或 .reversed() 方法可以改变排序方向。将 reverseOrder() 作为第二个参数传入 thenComparing,即可实现主键升序、次键降序的组合。

import java.util.*;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
List<person> list = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Alice", 25)
);
// 主键:姓名升序,次键:年龄降序
list.sort(Comparator
.comparing(Person::getName)
.thenComparing(Comparator.reverseOrder())
);
for (Person p : list) {
System.out.println(p.getName() + ", " + p.getAge());
}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
}</person>
如何处理空值排序
当字段可能为 null 时,直接使用 comparing 会抛出 NullPointerException。应使用 Comparator.nullsFirst() 或 nullsLast() 包裹比较器,确保空值被安全地排在最前或最后。

import java.util.*;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
List<person> list = Arrays.asList(
new Person("Alice", null),
new Person("Bob", 25),
new Person(null, 30)
);
// 姓名升序(空值在前),年龄升序(空值在后)
list.sort(Comparator
.comparing(Person::getName, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))
);
for (Person p : list) {
System.out.println(p.getName() + ", " + p.getAge());
}
}
}
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) { this.name = name; this.age = age; }
public String getName() { return name; }
public Integer getAge() { return age; }
}</person>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











