Java对象数组多条件排序与过滤需分离处理:排序用Arrays.sort()配合Comparator链式构造,过滤用Stream.filter()组合条件;推荐先过滤再排序以提升性能。

Java 对象数组的多条件排序和过滤,核心是分开处理:排序靠 Arrays.sort() 配合 Comparator 链式构造;过滤靠 Stream.filter() 组合条件。两者可独立使用,也能串联——先过滤再排序更高效。
多条件排序:用 Comparator 链式表达优先级
不用手写嵌套 if,直接用 Comparator.comparing() 和 thenComparing() 拼接规则,每级可独立指定升/降序:
- 先按部门升序,部门相同时按入职时间降序:
Arrays.sort(employees, Comparator.comparing(Employee::getDept).thenComparing(Employee::getHireDate, Comparator.reverseOrder())); - 按年龄降序、姓名升序(字符串可能为 null):
Arrays.sort(people, Comparator.comparingInt(Person::getAge).reversed().thenComparing(Person::getName, Comparator.nullsLast(String::compareTo))); - 避免整数溢出:字段是
int时优先用comparingInt,它内部调用Integer.compare(),比a.age - b.age安全
空值安全:null 不再导致崩溃
对象字段或整个数组元素为 null 时,必须显式处理,否则抛 NullPointerException:
- 字段可能为 null(如
person.getScore()返回 null):
用Comparator.comparing(Person::getScore, Comparator.nullsLast(Comparator.naturalOrder())) - 整个数组元素可能为 null:
用Comparator.nullsLast(Comparator.comparing(p -> p != null ? p.getScore() : null)),或提前用 Stream 过滤掉 null
过滤:Stream.filter 支持单条件与多条件组合
数组本身不支持原地过滤,需转为 Stream 处理。多条件可用链式 filter 或 Predicate.and() 合并:
立即学习“Java免费学习笔记(深入)”;
- 链式写法(推荐,清晰易读):
Person[] filtered = Arrays.stream(people)<br> .filter(p -> p != null)<br> .filter(p -> p.getAge() >= 18)<br> .filter(p -> "IT".equals(p.getDept()))<br> .toArray(Person[]::new);
- 合并条件(适合复用):
Predicate<Person> adult = p -> p.getAge() >= 18;<br>Predicate<Person> inIT = p -> "IT".equals(p.getDept());<br>Person[] result = Arrays.stream(people)<br> .filter(adult.and(inIT))<br> .toArray(Person[]::new);
排序 + 过滤串联:先筛后排更合理
业务中常需“查出符合条件的记录,再按某规则排列”,应先过滤再排序,减少比较次数,提升性能:
Person[] sortedActive = Arrays.stream(people)<br> .filter(p -> p != null && p.isActive())<br> .sorted(Comparator.comparing(Person::getScore).reversed())<br> .toArray(Person[]::new);
- 注意:
sorted()返回新数组,原数组不变;若需原地修改且数据量大,仍建议用Arrays.sort()配合已过滤后的子数组


















