stream 分组并排序,取每组中的第一条数据
时间: 2023-08-12 09:27:44 浏览: 608
可以使用 Java 8 的 Stream API 中的 `groupingBy()` 方法和 `Collectors.maxBy()` 方法来实现。
假设有一个实体类 `Person`,包含属性 `name` 和 `age`,可以按照以下方式分组并排序,取每组中的第一个人:
```java
List<Person> personList = new ArrayList<>();
// 假设有一个包含多个 Person 对象的列表
Map<String, Optional<Person>> result = personList.stream()
.collect(Collectors.groupingBy(
Person::getName, // 按照姓名分组
Collectors.maxBy(Comparator.comparingInt(Person::getAge)) // 取每组中的最大年龄值
));
List<Person> resultList = result.values().stream()
.filter(Optional::isPresent) // 过滤掉空值
.map(Optional::get) // 获取每组中的第一个人
.collect(Collectors.toList()); // 将结果转换为列表
resultList.forEach(System.out::println); // 输出结果
```
上述代码会将 `personList` 列表中的 `Person` 对象按照姓名分组,并取每组中的最大年龄值。然后,从每组中取最大年龄值对应的 `Person` 对象,最后将结果转换为列表输出。
需要注意的是,`maxBy()` 方法返回的是一个 `Optional` 对象,需要使用 `Optional::isPresent` 方法过滤掉空值,再使用 `Optional::get` 方法获取每组中的第一个人。
阅读全文