Java Stream API 的 sorted() 方法实现排序,支持自然排序(调用 compareTo)和自定义比较器(如 comparing、nullsFirst),返回新流不修改原集合;它是有状态中间操作,大数据量时性能较低,且不可用于无限流。

Java Stream API 中的 sort 排序操作,核心是通过 sorted() 方法实现,它支持自然排序和自定义比较器两种方式,且返回的是一个新的有序流,不修改原集合。
自然排序(Comparable 类型)
当集合元素实现了 Comparable 接口(如 String、Integer、LocalDate 等),可直接调用无参 sorted():
List<String> sorted = list.stream().sorted().collect(Collectors.toList());- 底层调用元素的
compareTo()方法,升序排列 - 若元素为
null,运行时抛出NullPointerException
自定义排序(Comparator)
对未实现 Comparable 的类,或需改变默认顺序时,传入 Comparator:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 升序:
sorted(Comparator.naturalOrder()) - 降序:
sorted(Comparator.reverseOrder()) - 按字段:
sorted(Comparator.comparing(User::getAge)) - 多级排序:
sorted(Comparator.comparing(User::getAge).thenComparing(User::getName)) - 空值安全:用
Comparator.nullsFirst()或Comparator.nullsLast()包装
注意点与常见陷阱
sorted() 是中间操作,但它是有状态的(需缓冲全部数据才能排序),因此性能上不如遍历+手动排序高效,尤其在大数据量时:
立即学习“Java免费学习笔记(深入)”;
- 不能在并行流中依赖原始顺序做“稳定排序”以外的逻辑
- 对引用类型排序时,若比较器逻辑错误(如违反自反性、传递性),可能抛出
IllegalArgumentException - 若源流为无限流(如
Stream.iterate),sorted()将永远阻塞 - 排序结果是新流,原集合不受影响;如需更新原集合,需显式收集回容器
结合其他操作的典型用法
排序常与 filter、map、limit 等组合使用,注意执行顺序影响效率:
- 先
filter再sorted:减少待排序元素数量,推荐 - 避免
sorted().limit(n):必须全排序后截取,低效;改用limit(n).sorted()不等价,仅对前 n 个排序 - 获取 Top-N:可用
sorted(comparator).limit(n).collect(...),或更优解——用Collectors.collectingAndThen配合TreeSet或优先队列(需手写)

















