Java多条件排序核心是Comparator链式调用thenComparing(),支持字段排序、null安全(nullsFirst/nullsLast)、逆序(reverseOrder)及Lambda自定义逻辑,适用于List.sort()和Stream.sorted()。
Java中实现多条件排序,核心是利用Comparator接口的链式比较能力,通过thenComparing()方法逐级指定优先级。不需要手写冗长的if-else逻辑,现代写法简洁且可读性强。
对一个实体类(如Student)按“年级升序 → 班级升序 → 分数降序”排序:
students.sort(Comparator.comparing(Student::getGrade)
.thenComparing(Student::getClazz)
.thenComparing(Student::getScore, Comparator.reverseOrder()));
说明:
comparing()指定第一排序字段和自然顺序(升序)thenComparing()追加第二、第三条件,支持方法引用或自定义Comparator
reverseOrder()用于降序;也可用reversed()反转前一个比较器字段可能为null时,直接调用getXXX()会抛异常。应使用comparing()的重载版本指定nullsFirst()或nullsLast():
Comparator.comparing(Student::getName, Comparator.nullsLast(String::compareTo))
.thenComparing(Student::getAge, Comparator.nullsFirst(Integer::compareTo))
常见组合:
nullsFirst(Comparator.naturalOrder()):null排最前,其余升序nullsLast(Comparator.reverseOrder()):null排最后,其余降序当排序依据不是简单getter,而是计算值或业务规则时,可传入Lambda表达式:
students.sort(Comparator.comparing(
s -> s.getScore() >= 90 ? "A" :

s.getScore() >= 80 ? "B" : "C"
).thenComparing(Student::getScore));
注意点:
无论用List.sort()还是Stream.sorted(),Comparator写法完全一致:
// 集合原地排序 list.sort(comparator); // 流式处理,返回新列表 Listsorted = list.stream() .sorted(comparator) .collect(Collectors.toList());
推荐场景:
sort()更省内存Stream.sorted()
基本上就这些。多条件排序不复杂但容易忽略null和逆序细节,用好thenComparing和nullsFirst/Last就能覆盖绝大多数业务场景。