sorted()是stream的中间操作,返回新流实现自然排序或自定义排序:无参版要求元素实现comparable,有参版接受comparator;需注意null处理、有序性及本地化排序等细节。

Java 中 sorted() 是 Stream 的中间操作方法,用于对流中的元素进行自然排序或按自定义规则排序。它不会修改原数据,而是返回一个**新流**,其中元素按指定顺序排列。
sorted() 的两种用法
1. 无参 sorted() —— 要求元素实现 Comparable 接口
适用于 String、Integer、LocalDateTime 等自带自然序的类型,或你自定义的类实现了 Comparable。
List<integer> numbers = Arrays.asList(5, 2, 8, 1);
List<integer> sorted = numbers.stream()
.sorted() // 按升序(自然序)
.collect(Collectors.toList()); // [1, 2, 5, 8]
</integer></integer>
2. 带 Comparator 参数的 sorted(Comparator)
用于自定义排序逻辑,比如降序、按对象字段排序、忽略大小写等。
List<string> words = Arrays.asList("apple", "Banana", "cherry");
List<string> sortedIgnoreCase = words.stream()
.sorted(String.CASE_INSENSITIVE_ORDER) // 忽略大小写升序
.collect(Collectors.toList());
List<person> people = ...;
List<person> sortedByAge = people.stream()
.sorted(Comparator.comparing(Person::getAge)) // 按 age 升序
.collect(Collectors.toList());
List<person> sortedByAgeDesc = people.stream()
.sorted(Comparator.comparing(Person::getAge).reversed()) // 降序
.collect(Collectors.toList());
</person></person></person></string></string>
常见注意事项
- 对
null值要小心:默认Comparator不支持null,会抛NullPointerException;可用Comparator.nullsFirst()或Comparator.nullsLast()处理 -
sorted()是有状态操作,会触发流的“短路”失效(即不能并行流中高效短路),但不影响正确性 - 如果流是有序的(如来自
ArrayList的顺序流),sorted()后仍保持有序;但并行流排序结果确定,只是内部执行方式不同 - 字符串默认按 Unicode 值排序,中文会按编码顺序排(非拼音),需配合
Collator实现本地化排序
结合其他操作的典型用法
排序常与 limit()、skip()、distinct() 等联用:
// 取年龄最大的前 3 个人(先降序,再取前 3)
List<person> top3Oldest = people.stream()
.sorted(Comparator.comparing(Person::getAge).reversed())
.limit(3)
.collect(Collectors.toList());
// 去重后按长度排序字符串
List<string> uniqueSortedByLength = words.stream()
.distinct()
.sorted(Comparator.comparing(String::length))
.collect(Collectors.toList());
</string></person>
自定义类排序的小提醒
若想直接用无参 sorted(),你的类需实现 Comparable:
public class Person implements Comparable<person> {
private String name;
private int age;
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age); // 按 age 升序
}
}
// 然后就可以直接 .sorted()
</person>
不过更推荐用 Comparator.comparing(),更灵活、可读性强,且无需修改类定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











