java中对象数组多属性排序主要用comparator.comparing()链式调用实现,支持null安全、逆序及嵌套属性;先按name升序,再按age降序,最后按id升序;适用于arrays.sort()和collections.sort(),可封装为静态常量复用。

Java 中对对象数组按多个属性排序,主要靠 Comparator 配合 Comparator.comparing() 的链式调用实现,简洁且类型安全。
使用 Comparator.comparing 链式比较
从 Java 8 开始,推荐用 Comparator.comparing + thenComparing 组合多个排序条件。它天然支持 null 安全、逆序、嵌套属性等。
- 先按主属性(如 name)升序,再按次属性(如 age)降序,最后按 id 升序
- 每个
thenComparing都可单独指定排序方向或处理 null - 适用于
Arrays.sort()(数组)和Collections.sort()(List)
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Person[] people = { /* ... */ };
Arrays.sort(people,
Comparator.comparing(Person::getName) // 主:name 升序
.thenComparing(Person::getAge, Comparator.reverseOrder()) // 次:age 降序
.thenComparingInt(Person::getId)); // 再次:id 升序(int 类型用 thenComparingInt 更高效)
处理 null 值和自定义逻辑
如果属性可能为 null,直接调用 getter 会抛 NPE。应配合 Comparator.nullsFirst() 或 nullsLast() 包装比较器。
Comparator.comparing(Person::getNickName, Comparator.nullsLast(String::compareTo))- 也可用 lambda 写复杂逻辑,比如按姓名长度排序,长度相同时再按字典序:
Comparator.comparing((Person p) -> p.getName().length())<br> .thenComparing(Person::getName)
复用比较器与封装成工具方法
多个地方需要相同排序逻辑时,建议将 Comparator 声明为静态常量或封装为工具方法,避免重复创建。
- 在 Person 类中定义:
public static final Comparator<person> BY_NAME_THEN_AGE =<br> Comparator.comparing(Person::getName)<br> .thenComparingInt(Person::getAge);</person>
- 外部调用:
Arrays.sort(people, Person.BY_NAME_THEN_AGE);
注意数组 vs List 的差异
对象数组用 Arrays.sort(T[], Comparator);如果是 List<person></person>,则用 Collections.sort(list, comparator) 或 Java 11+ 的 list.sort(comparator)。
- 数组不能直接用 stream 排序(stream 返回新数组,不改变原数组)
- 若需流式处理并返回新排序数组:
Person[] sorted = Arrays.stream(people)<br> .sorted(Comparator.comparing(Person::getName))<br> .toArray(Person[]::new);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










