stream().sorted 多个字段排序
时间: 2023-10-13 17:19:30 浏览: 590
在 Java 8 中,我们可以使用 `sorted` 方法对流进行排序。如果要按照多个字段进行排序,可以按照以下步骤操作:
1. 先按照第一个字段进行排序,使用 `Comparator.comparing` 方法指定排序的字段,例如:
```java
Comparator<Person> firstComparator = Comparator.comparing(Person::getAge);
```
2. 如果第一个字段相同,则按照第二个字段进行排序,使用 `thenComparing` 方法指定第二个排序字段,例如:
```java
Comparator<Person> secondComparator = firstComparator.thenComparing(Person::getName);
```
3. 将多个排序条件组合起来,使用 `sorted` 方法进行排序,例如:
```java
List<Person> sortedList = persons.stream()
.sorted(secondComparator)
.collect(Collectors.toList());
```
上述代码中,首先按照年龄进行排序,如果年龄相同,则按照姓名进行排序。最终得到的 `sortedList` 就是按照多个字段进行排序后的结果。
相关问题
stream.sorted 按照某个字段排序
`stream.sorted()` 可以对一个 Stream 中的元素进行排序,默认是按照自然顺序进行排序。如果想要按照某个字段排序,可以使用 `sorted()` 的重载方法,该方法接收一个 Comparator 参数,用来指定排序的方式。
以一个对象列表为例,假设这个对象有一个属性叫做 "age",我们想要按照年龄从小到大排序,可以这样写:
```java
List<Person> personList = new ArrayList<>();
// 添加一些 Person 对象到列表中
List<Person> sortedList = personList.stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
```
在这个例子中,`Comparator.comparingInt(Person::getAge)` 指定了按照 age 属性进行排序,然后将排序结果收集到一个新的列表中。
如果需要按照多个字段进行排序,可以使用 `thenComparing()` 方法进行链式调用,例如:
```java
List<Person> sortedList = personList.stream()
.sorted(Comparator.comparingInt(Person::getAge)
.thenComparing(Person::getName))
.collect(Collectors.toList());
```
这个例子中,先按照 age 进行排序,如果 age 相同则按照 name 进行排序。
aa.stream().sorted如何指定字段排序
`aa.stream().sorted()` 是Java中对集合进行流式处理时,对元素进行排序的一个方法。在这个序列化操作中,默认情况下会按照元素自然顺序(即对象的 `compareTo` 方法)进行升序排列。如果你想按照特定字段进行排序,你需要提供一个自定义的比较器(Comparator)。
例如,假设你有一个Person类,有两个属性:age和name,你可以这样指定按age字段降序或name字段升序排序:
```java
List<Person> people = ...; // 假设这是Person类型的列表
// 按照age字段降序排序
people.stream()
.sorted(Comparator.comparing(Person::getAge).reversed())
.collect(Collectors.toList());
// 或者按照name字段升序排序
people.stream()
.sorted(Comparator.comparing(Person::getName))
.collect(Collectors.toList());
```
这里的关键是通过 `comparing` 函数获取一个用于比较的方法引用,`reversed()` 可以改变排序方向为降序,如果不需要改变方向,则直接传入即可。
如果你想要在多个字段之间进行复合排序(比如先按年龄排序,然后按名字排序),你可以组合两个比较器:
```java
people.stream()
.sorted(
Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getName)
)
.collect(Collectors.toList());
```
上述代码首先根据age排序,如果有相同age,则再根据name排序。记得在构造比较器时,要确保它们能够正确配合你的数据类型和需求。
阅读全文
相关推荐















