Java中stream().sorted()排序不修改原集合,需collect()获取新集合;支持自然顺序、字段升降序、多级排序、自定义比较器及null安全处理,注意其为中间操作且ArrayList性能更优。

Java 中用 stream().sorted() 对集合排序,核心是传入合适的比较器(Comparator),或利用自然顺序。它返回一个新的已排序流,**不修改原集合**,需配合 collect() 才能得到新集合。
按自然顺序排序(元素实现 Comparable)
如果集合元素(如 String、Integer、自定义类且实现了 Comparable)有自然顺序,直接调用 sorted() 即可:
Listnums = Arrays.asList(3, 1, 4, 1); Listsorted = nums.stream().sorted().collect(Collectors.toList()); // [1, 1, 3, 4]
按指定字段升序/降序排序(使用 Comparator.comparing)
对对象列表按某个属性排序最常用方式:
- 升序:
sorted(Comparator.comparing(Person::getAge)) - 降序:
sorted(Comparator.comparing(Person::getAge).reversed()) - 多级排序(先按年龄升序,年龄相同时按姓名降序):
sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getName, Comparator.reverseOrder()))
自定义比较逻辑(Lambda 或匿名 Comparator)
当内置方法不够用时,可写 Lambda 表达式:
- 按字符串长度排序:
list.stream().sorted((s1, s2) -> s1.length() - s2.length()).collect(...) - 更安全的写法(避免整数溢出):
Comparator.comparingInt(String::length) - 处理 null 值(默认会抛
NullPointerException):sorted(Comparator.nullsLast(Comparator.comparing(Person::getName)))
注意点和常见陷阱
sorted() 是中间操作,必须终端操作才能执行;不收集结果就白调了。
- 错误:
list.stream().sorted();→ 没有任何效果 - 正确:
list.stream().sorted().forEach(System.out::println);或.collect(Collectors.toList()) -
sorted()要求数据源支持随机访问才高效(如ArrayList),LinkedList上性能较差 - 原始类型数组(如
int[])不能直接 stream,要用Arrays.stream(arr).sorted()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











