stream().sorted()排序
时间: 2025-05-24 16:13:26 浏览: 12
### Java Stream API `sorted()` 方法使用详解
`sorted()` 是 Java Stream API 中的重要方法之一,主要用于对流中的元素进行排序。它可以实现自然排序和自定义排序,并支持通过 Lambda 表达式简化代码逻辑。
#### 自然排序
当流中的对象实现了 `Comparable` 接口时,可以直接调用 `sorted()` 进行自然排序。以下是基于整数列表的简单示例:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class NaturalSortExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 3, 8, 1, 9);
List<Integer> sortedNumbers = numbers.stream()
.sorted() // 默认按自然顺序排序
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出: [1, 3, 5, 8, 9]
}
}
```
此代码展示了如何利用 `sorted()` 对整数列表进行升序排列[^1]。
---
#### 自定义排序
如果需要按照特定规则排序,则可以通过传递 `Comparator` 实现自定义排序逻辑。例如,对于学生对象按年龄降序排序:
```java
import java.util.*;
import java.util.stream.Collectors;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
public class CustomSortExample {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 20),
new Student("Bob", 22),
new Student("Charlie", 19)
);
List<Student> sortedStudents = students.stream()
.sorted(Comparator.comparing(Student::getAge).reversed()) // 按年龄降序
.collect(Collectors.toList());
System.out.println(sortedStudents);
/*
* 输出:
* [
* Student{name='Bob', age=22},
* Student{name='Alice', age=20},
* Student{name='Charlie', age=19}
* ]
*/
}
}
```
在此示例中,`Comparator.comparing(Student::getAge)` 定义了一个比较器来提取学生的年龄属性作为排序依据,而 `.reversed()` 则将其转换为降序排序[^5]。
---
#### 多字段排序
有时可能需要根据多个字段进行排序。例如,先按年龄升序再按姓名字母顺序排序:
```java
List<Student> multiFieldSortedStudents = students.stream()
.sorted(Comparator.comparing(Student::getAge)
.thenComparing(Student::getName)) // 额外增加第二级排序条件
.collect(Collectors.toList());
System.out.println(multiFieldSortedStudents);
/*
* 假设输入数据中有两个相同年龄的学生,
* 此处会进一步按名字字典序排序。
*/
```
这里使用了链式的 `thenComparing` 方法,在主要排序键相同时引入次级排序标准[^5]。
---
### 总结
- **自然排序**适用于已实现 `Comparable` 接口的对象,默认遵循其内部定义的顺序。
- **自定义排序**允许开发者灵活指定任意复杂的排序策略,通常借助于 `Comparator` 和 Lambda 表达式完成。
- **多字段排序**可通过组合多个 `comparing` 调用来满足更精细的数据整理需求。
阅读全文
相关推荐


















