sorted()是Stream API的有状态中间操作,用于返回新有序流:支持自然排序(元素需实现Comparable)和Comparator自定义排序(降序、多级、空值安全等),不可用于无限流,需配合collect等终止操作获取结果。

Java 中 sorted() 是 Stream API 提供的中间操作,用于对流中元素进行排序,返回一个新的有序流,不修改原数据。它有两种常用重载形式:一种依赖元素自身的自然顺序(要求元素实现 Comparable),另一种接受自定义的 Comparator 实现灵活排序逻辑。
使用自然顺序排序(元素需实现 Comparable)
当流中元素类型(如 String、Integer、LocalDate 等)已实现 Comparable 接口时,可直接调用无参 sorted():
-
字符串按字典序升序:
Stream.of("banana", "apple", "cherry").sorted()→["apple", "banana", "cherry"] -
整数按数值升序:
Stream.of(5, 1, 9).sorted()→[1, 5, 9] - 若元素未实现
Comparable(如自定义类未实现接口),运行时会抛出ClassCastException
使用 Comparator 自定义排序规则
通过传入 Comparator 可实现升序、降序、多条件、空值安全等复杂排序:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
降序排列:
sorted(Comparator.reverseOrder())(适用于Comparable类型) -
按对象字段排序:
sorted(Comparator.comparing(Person::getAge)) -
链式多级排序:
sorted(comparing(Person::getAge).thenComparing(Person::getName)) -
处理 null 值:
sorted(comparing(Person::getName, nullsFirst(String::compareTo)))
注意 sorted 是有状态操作,影响性能和使用限制
sorted() 需要收集全部元素后才能开始输出,属于有状态中间操作:
立即学习“Java免费学习笔记(深入)”;
- 无法与无限流(如
Stream.iterate)配合使用,否则会无限等待 - 对大数据量流可能带来内存和时间开销,慎用于未限制大小的集合
- 通常建议在
filter、map等操作之后再排序,减少参与排序的元素数量
结合 collect 获取排序结果
sorted() 本身不触发执行,需终止操作获取结果:
- 转为列表:
stream.sorted().collect(Collectors.toList()) - 取前 N 个(如 Top-K):
stream.sorted(reverseOrder()).limit(3).collect(toList()) - 转数组:
stream.sorted().toArray(String[]::new) - 注意:多次调用
sorted()不会叠加效果,后一次会覆盖前一次

















