在Java实际开发中,我们经常需要对包含嵌套结构的对象集合进行排序,例如订单对象中包含用户对象,要求先按订单状态排序,再按用户注册时间排序。这种主对象字段与嵌套对象字段协同排序的需求,可以通过Comparator接口灵活实现。

使用Comparator链式调用实现协同排序
Java 8引入的Comparator接口提供了thenComparing方法,可以很方便地实现多字段排序。下面的例子展示了如何先按部门名称(嵌套对象字段)排序,再按员工年龄(主对象字段)排序。
import java.util.*;
import java.util.stream.Collectors;
class Department {
private String name;
public Department(String name) { this.name = name; }
public String getName() { return name; }
}
class Employee {
private String name;
private int age;
private Department dept;
public Employee(String name, int age, Department dept) {
this.name = name; this.age = age; this.dept = dept;
}
public String getName() { return name; }
public int getAge() { return age; }
public Department getDept() { return dept; }
}
public class SortDemo {
public static void main(String[] args) {
List<Employee> list = Arrays.asList(
new Employee("张三", 30, new Department("研发")),
new Employee("李四", 25, new Department("测试")),
new Employee("王五", 28, new Department("研发"))
);
// 先按部门名称,再按年龄排序
List<Employee> sorted = list.stream()
.sorted(Comparator.comparing((Employee e) -> e.getDept().getName())
.thenComparing(Employee::getAge))
.collect(Collectors.toList());
sorted.forEach(e -> System.out.println(e.getDept().getName() + " " + e.getName() + " " + e.getAge()));
}
}
处理嵌套对象可能为null的情况
真实数据中嵌套对象可能为null,直接使用getDept().getName()会抛出空指针异常。可以使用Comparator.nullsLast进行安全处理。
import java.util.*;
import java.util.stream.Collectors;
public class SafeSortDemo {
public static void main(String[] args) {
List<Employee> list = Arrays.asList(
new Employee("张三", 30, null),
new Employee("李四", 25, new Department("测试"))
);
List<Employee> sorted = list.stream()
.sorted(Comparator.comparing(
(Employee e) -> e.getDept() == null ? null : e.getDept().getName(),
Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(Employee::getAge, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.toList());
sorted.forEach(e -> System.out.println((e.getDept()==null?"无部门":e.getDept().getName()) + " " + e.getName()));
}
}
使用自定义Comparator类
如果排序逻辑复杂,可以抽取独立的Comparator实现类,提升代码可读性。
import java.util.*;
class EmployeeComparator implements Comparator<Employee> {
public int compare(Employee a, Employee b) {
// 主对象字段:年龄升序
int ageCmp = Integer.compare(a.getAge(), b.getAge());
if (ageCmp != 0) return ageCmp;
// 嵌套对象字段:部门名称
String an = a.getDept() == null ? "" : a.getDept().getName();
String bn = b.getDept() == null ? "" : b.getDept().getName();
return an.compareTo(bn);
}
}
public class CustomSort {
public static void main(String[] args) {
List<Employee> list = new ArrayList<>();
list.sort(new EmployeeComparator());
}
}
总结
协同排序的核心在于合理组合主对象与嵌套对象的比较逻辑。链式Comparator适合简单场景,nullsLast保障健壮性,自定义比较器适合复用与复杂规则。根据业务特点选择合适方式即可。
Java嵌套对象排序Comparator修改时间:2026-07-25 23:45:21