java stream groupby返回对象
时间: 2023-07-28 19:09:55 浏览: 200
Java Stream 的 `groupingBy` 方法可以将流中的元素按照某个特征分组,返回一个 `Map` 对象,其中键为分组特征,值为对应的元素列表。如果你希望返回一个对象而不是一个列表,则可以使用 `Collectors.toMap` 方法来指定键和值的映射关系。
下面是一个示例代码:
假设有一个 `Person` 类,包含 `name` 和 `age` 两个属性:
```java
public class Person {
private String name;
private int age;
// 省略构造函数和 getter/setter 方法
}
```
现在我们有一组 `Person` 对象,想要按照年龄分组,并返回每个年龄分组中最年长的人。可以使用以下代码实现:
```java
List<Person> persons = new ArrayList<>();
// 假设已经将 persons 中的 Person 对象初始化好了
Map<Integer, Person> oldestPersonByAge = persons.stream()
.collect(Collectors.groupingBy(Person::getAge))
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream().max(Comparator.comparingInt(Person::getAge)).orElse(null)
));
```
上述代码首先使用 `groupingBy` 方法按照年龄分组,然后使用 `entrySet` 方法将分组后的 `Map` 转换为 `Stream<Map.Entry<Integer, List<Person>>>>`,最后使用 `toMap` 方法将每个分组中最年长的人作为值返回。
需要注意的是,如果某个分组中没有人,则最终返回的 `Map` 中该键对应的值为 `null`。如果希望返回一个空的 `Person` 对象或者抛出异常等,则需要在 `toMap` 方法中添加适当的逻辑。
阅读全文