Java中流排序主要用sorted()方法:无参版按自然顺序升序,如Integer、String;带Comparator参数可自定义,如reverseOrder()实现降序,comparing().reversed()或thenComparing()处理多字段排序。

Java 中对流(Stream)中的元素排序,主要通过 sorted() 方法实现。它有两种常用重载形式:无参版本(按自然顺序升序)和带 Comparator 参数的版本(可自定义升序或降序)。
使用自然顺序升序排序
对于实现了 Comparable 接口的类型(如 String、Integer、LocalDate 等),直接调用 sorted() 即可按自然顺序升序排列:
List<Integer> numbers = Arrays.asList(5, 2, 8, 1);
List<Integer> sortedAsc = numbers.stream()
.sorted() // 默认升序
.collect(Collectors.toList());
// 结果:[1, 2, 5, 8]
使用 Comparator 实现降序排序
降序需传入一个比较器。最简洁的方式是使用 Comparator.reverseOrder():
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
Integer、String等类型:直接用Comparator.reverseOrder() - 自定义对象:可用
Comparator.comparing(YourClass::getField).reversed()
List<Integer> numbers = Arrays.asList(5, 2, 8, 1);
List<Integer> sortedDesc = numbers.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
// 结果:[8, 5, 2, 1]
// 对字符串列表降序
List<String> words = Arrays.asList("apple", "banana", "cherry");
words.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println); // cherry, banana, apple
对自定义对象按字段排序(升序 + 降序)
假设有一个 Person 类,按年龄升序、姓名降序:
立即学习“Java免费学习笔记(深入)”;
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30)
);
// 先按 age 升序,age 相同时按 name 降序
List<Person> sorted = people.stream()
.sorted(Comparator.comparing(Person::age)
.thenComparing(Person::name, Comparator.reverseOrder()))
.collect(Collectors.toList());
注意事项
-
sorted()是中间操作,返回新流,不修改原数据 - 流必须是有序的(如来自
List)才能保证排序结果稳定;并行流中排序仍有效,但性能取决于数据量和比较逻辑 - 若元素为
null,自然排序会抛出NullPointerException,可改用Comparator.nullsFirst()或nullsLast()处理

















