stream流 对象集合根据多字段分组
时间: 2024-09-23 18:09:01 浏览: 139
Stream API在Java中提供了一种高效处理大数据集的方式,它允许你在集合上进行各种操作,包括基于多个字段进行分组。当需要按照两个或更多属性对数据进行分组时,可以使用`Collectors.groupingBy`方法。
假设我们有一个Person对象列表,包含姓名(name)和年龄(age),我们可以这样做:
```java
List<Person> people = ...; // 假设Person类有name和age属性
Map<String, List<Person>> groupedPeople = people.stream()
.collect(Collectors.groupingBy(Person::getName, Collectors.mapping(Person::getAge, Collectors.toList())));
```
这将返回一个Map,键是人的名字,值是一个Person对象列表,列表中的人都有相同的年龄。这里的`Person::getName`和`Person::getAge`是方法引用,表示对每个元素按name属性分组,并提取出age属性用于创建新的列表。
相关问题
strem流对对象集合的某个字段分组
Java 8中的流可以使用Collectors.groupingBy()方法对对象集合中的某个字段进行分组。假设有一个Person类,其中包含id和name字段,可以使用以下代码根据id字段对Person对象集合进行分组操作:
```
List<Person> personList = new ArrayList<>();
//添加一些Person对象到personList
Map<Long, List<Person>> groupedPersons = personList.stream()
.collect(Collectors.groupingBy(Person::getId));
```
这个代码中,我们使用了Collectors.groupingBy()方法,它接受一个Function参数来提取对象的key,这里我们使用Person::getId方法作为key提取器。它将返回一个Map<Long, List<Person>>,其中key是id,value是包含该id的所有Person对象的列表。
stream流 list根据某个字段分组
### 使用 Java Stream API 对 List 进行基于对象字段的分组
在 Java 中,`Stream API` 提供了一种简洁而强大的方式来处理集合数据。要根据对象的一个特定字段对 `List` 进行分组,可以使用 `Collectors.groupingBy()` 方法。
下面是一个具体的例子,展示如何实现这一功能:
假设有一个名为 `Person` 的类,其中包含姓名 (`name`) 和年龄 (`age`) 字段:
```java
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters...
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
```
现在创建一些 `Person` 实例并放入列表中:
```java
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30),
new Person("David", 25)
);
```
接下来利用 `stream().collect(Collectors.groupingBy())` 来按照 `age` 属性进行分组:
```java
Map<Integer, List<Person>> groupedPeople = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
```
上述代码会返回一个映射表 (map),键为整数类型的年龄值,对应的值则是一系列具有相同年龄的人组成的列表[^1]。
如果想要进一步统计每一年龄段有多少个人,则可以在收集器链上调用另一个收集器 `counting()` :
```java
Map<Integer, Long> countPerAgeGroup = people.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
```
这段代码将会给出每个年龄段人数的结果。
阅读全文
相关推荐

















