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());</string>- 底层调用元素的
compareTo()方法,升序排列 - 若元素为
null,运行时抛出NullPointerException
自定义排序(Comparator)
对未实现 Comparable 的类,或需改变默认顺序时,传入 Comparator:
- 升序:
sorted(Comparator.naturalOrder()) - 降序:
sorted(Comparator.reverseOrder()) - 按字段:
sorted(Comparator.comparing(User::getAge)) - 多级排序:
sorted(Comparator.comparing(User::getAge).thenComparing(User::getName)) - 空值安全:用
Comparator.nullsFirst()或Comparator.nullsLast()包装
注意点与常见陷阱
sorted() 是中间操作,但它是有状态的(需缓冲全部数据才能排序),因此性能上不如遍历+手动排序高效,尤其在大数据量时:
- 不能在并行流中依赖原始顺序做“稳定排序”以外的逻辑
- 对引用类型排序时,若比较器逻辑错误(如违反自反性、传递性),可能抛出
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或优先队列(需手写)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











