Java Stream的sorted()方法用于排序,支持自然排序(元素实现Comparable)和定制排序(传入Comparator),返回新有序流,是有状态中间操作,需缓存全部元素。

Java Stream 的 sorted() 方法用于对流中的元素进行排序,支持自然排序(元素实现 Comparable)和定制排序(传入 Comparator)。它返回一个新的有序流,不修改原数据,且是**有状态的中间操作**——意味着它可能需要缓存全部元素才能完成排序。
自然排序:直接调用 sorted() 即可
当流中元素类型实现了 Comparable 接口(如 String、Integer、LocalDate 等),可直接使用无参 sorted() 进行升序排列:
- List
names = Arrays.asList("zebra", "apple", "banana"); - names.stream().sorted().forEach(System.out::println);
- // 输出:apple, banana, zebra(按字典序升序)
注意:自然排序默认为升序;若需降序,不能仅靠 sorted(),需配合 Comparator.reverseOrder()(见下文)。
定制排序:传入 Comparator 实现灵活规则
通过 sorted(Comparator) 可定义任意比较逻辑。常用方式包括:
-
方法引用:如
String::compareToIgnoreCase忽略大小写排序 -
Comparator 静态方法:如
Comparator.naturalOrder()、Comparator.reverseOrder()、Comparator.comparing() -
链式比较:用
thenComparing()处理多级排序(如先按年龄,年龄相同时按姓名)
示例:
- List
people = ...; - // 按年龄升序,年龄相同时按姓名降序
- people.stream()
- .sorted(Comparator.comparing(Person::getAge)
- .thenComparing(Person::getName, Comparator.reverseOrder()))
- .forEach(System.out::println);
注意事项与常见陷阱
-
null 元素会抛出 NullPointerException:除非使用
Comparator.nullsFirst()或Comparator.nullsLast()显式处理 -
sorted() 是有状态操作:对无限流(如
Stream.iterate)调用会永远阻塞,不可用 -
原始类型流(IntStream 等)没有 sorted(Comparator),只有无参
sorted()(按数值自然序) - 性能考虑:底层使用 Timsort,平均时间复杂度 O(n log n),但需额外空间暂存元素
反向排序的简洁写法
无需手写比较器,推荐以下方式:
- // 字符串降序
- stream.sorted(Comparator.reverseOrder())
- // 自定义字段降序
- stream.sorted(Comparator.comparing(Person::getAge).reversed())
- // 或直接:.sorted(comparing(Person::getAge).reversed())
reversed() 是 Comparator 接口的默认方法,语义清晰且可读性强。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











