Stream.sorted()配合Comparator.comparing可实现多字段链式排序,支持null处理、自定义提取逻辑及filter前置优化性能。

用 Stream.sorted() 配合 Comparator.comparing 实现多字段排序
Java 8 的 Stream API 提供了简洁的链式排序能力。核心是 Comparator.comparing(),它能按单个字段提取值并比较;多个字段则通过 thenComparing() 串联。字段类型需实现 Comparable(如 String、Integer、LocalDateTime),或显式传入自定义 Comparator。
例如对用户列表按「部门升序 → 年龄降序 → 姓名升序」排序:
users.stream()
.sorted(Comparator.comparing(User::getDept)
.thenComparing(User::getAge, Comparator.reverseOrder())
.thenComparing(User::getName))
.collect(Collectors.toList());
处理 null 值:避免 NullPointerException
字段可能为 null,直接调用 comparing 会抛异常。推荐用 Comparator.nullsFirst() 或 nullsLast() 包装比较器:
Comparator.comparing(User::getDept, Comparator.nullsFirst(String::compareTo))thenComparing(User::getAge, Comparator.nullsLast(Comparator.reverseOrder()))
这样 null 部门排最前,null 年龄排最后,逻辑可控。
自定义字段逻辑:用 lambda 或方法引用灵活提取
不局限于 getter。可传入 lambda 表达式做预处理,比如按姓名长度排序、按状态枚举顺序排序:
- 按姓名长度升序:
comparing(u -> u.getName().length()) - 按状态优先级(ACTIVE > PENDING > INACTIVE):
comparing(u -> StatusPriority.valueOf(u.getStatus()).ordinal(), reverseOrder())
只要返回可比类型,就能参与链式排序。
结合过滤再排序:先 filter 后 sorted 更高效
若需「筛选出在职用户,再按入职时间倒序、姓名正序排列」,应把 filter() 放在 sorted() 前:
users.stream()
.filter(u -> "ACTIVE".equals(u.getStatus()))
.sorted(Comparator.comparing(User::getHireDate, Comparator.reverseOrder())
.thenComparing(User::getName))
.collect(Collectors.toList());
提前缩小数据集,减少排序开销,语义也更清晰。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











