使用Comparator的thenComparing实现多条件排序,先按年龄升序、分数降序、姓名升序排列,支持自定义逻辑与null安全处理。

在Java中对List进行多条件排序,可以通过Comparator接口结合Lambda表达式或方法引用来实现。从Java 8开始,Comparator提供了thenComparing()方法,可以方便地实现多个排序条件的叠加。
使用 thenComparing 实现多条件排序
假设有一个Person类,包含姓名、年龄和分数字段,我们希望先按年龄升序,再按分数降序,最后按姓名字母顺序排列:
// 定义 Person 类
class Person {
private String name;
private int age;
private double score;
public Person(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
// getter 方法
public String getName() { return name; }
public int getAge() { return age; }
public double getScore() { return score; }
@Override
public String toString() {
return name + "(" + age + ", " + score + ")";
}
}
对List进行多条件排序:
import java.util.*;
List people = Arrays.asList(
new Person("Alice", 25, 85.0),
new Person("Bob", 20, 90.0),
new Person("Charlie", 25, 95.0),
new Person("David", 20, 85.0)
);
people.sort(Comparator
.comparing(Person::getAge) // 年龄升序
.thenComparing(Person::getScore, Comparator.reverseOrder()) // 分数降序
.thenComparing(Person::getName) // 姓名升序
);
people.forEach(System.out::println);
输出结果为:
立即学习“Java免费学习笔记(深入)”;
ReportPlus数据报表中心小程序
ReportPlust意在打造一套精美的数据报表模板,里面高度封装日历组件、表格组件、排行榜组件、条形进度条组件、文本块组件以及ucharts的多个图表组件,用户只需要按照虚拟数据的格式,传特定数据即可方便、快捷地打造出属于自己的报表页面。该小程序主要使用了ucharts和wyb-table两插件实现的数据报表功能。 特点使用的是uni-app中最受欢迎的图表uCharts插件完成图表展示,该插件
下载
David(20, 85.0)
Bob(20, 90.0)
Alice(25, 85.0)
Charlie(25, 95.0)
自定义比较器逻辑
如果需要更复杂的比较逻辑,可以在comparing()中传入自定义的Comparator:
people.sort(Comparator
.comparing(Person::getAge)
.thenComparing(p -> -p.getScore()) // 负号实现降序
.thenComparing(p -> p.getName().length()) // 按名字长度排序
);
处理 null 值的安全排序
当字段可能为null时,应使用Comparator.nullsFirst()或nullsLast()避免空指针异常:
people.sort(Comparator
.comparing(Person::getName, Comparator.nullsFirst(String::compareTo))
.thenComparing(Person::getAge)
);
基本上就这些。利用Java 8的链式调用风格,多条件排序既简洁又可读性强,推荐优先使用Comparator.comparing()配合thenComparing()的方式实现。注意保持比较逻辑的一致性和可预测性,避免在运行时抛出异常。