java中arrays.sort()配合lambda表达式可简洁实现对象数组排序,核心是通过comparator接口的compare方法,支持升序、降序、null安全、多级排序及自定义逻辑等场景。

Java中用Arrays.sort()对对象数组排序时,Lambda表达式可简洁替代传统匿名内部类比较器,核心是实现Comparator<t></t>接口的compare(T o1, T o2)方法。
基本写法:一行搞定升序
假设有一个Person类,含name(String)和age(int)字段,按年龄升序排列:
Arrays.sort(people, (p1, p2) -> Integer.compare(p1.age, p2.age));
说明:
• 左侧(p1, p2)是两个Person参数;
• 右侧Integer.compare(...)安全处理int比较(避免整数溢出);
• 不要直接用p1.age - p2.age,可能因溢出导致错误结果。
按字符串字段排序:注意null安全
按姓名排序时,若数据可能含null,推荐用Comparator.nullsLast()或Comparator.nullsFirst()包装:
- Arrays.sort(people, Comparator.nullsLast(String::compareTo).reversed()); // 姓名降序,null排最后
- Arrays.sort(people, (p1, p2) -> Optional.ofNullable(p1.name).orElse("").compareTo(Optional.ofNullable(p2.name).orElse("")));
更清晰的做法是先定义比较器再传入,避免Lambda过长。
多级排序:链式调用
先按年龄升序,年龄相同时按姓名降序:
Arrays.sort(people, Comparator.comparingInt(p -> p.age).thenComparing(p -> p.name, Comparator.reverseOrder()));
说明:
• comparingInt专用于int字段,自动处理null(若字段为Integer需用comparing并指定null策略);
• thenComparing追加次级条件;
• 字符串比较可直接用Comparator.reverseOrder(),无需再写Lambda。
自定义逻辑:复杂判断直接写在Lambda里
比如优先排“VIP”用户(name以"VIP_"开头),再按年龄降序:
Arrays.sort(people, (p1, p2) -> {
boolean p1Vip = p1.name != null && p1.name.startsWith("VIP_");
boolean p2Vip = p2.name != null && p2.name.startsWith("VIP_");
if (p1Vip && !p2Vip) return -1;
if (!p1Vip && p2Vip) return 1;
return Integer.compare(p2.age, p1.age); // 年龄降序
});
当逻辑较复杂时,Lambda内用大括号写多行代码更易读,返回值用return明确控制。
不复杂但容易忽略细节:类型推断依赖数组元素类型,确保泛型一致;原始类型数组(如int[])不能用Comparator,需用对应重载方法。











