stream流 对象集合根据多字段分组
时间: 2024-09-23 16:09:01 浏览: 61
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根据对象的字段对对象集合进行分组
在Java 8中,可以使用流处理框架提供的操作来根据对象的字段对对象集合进行分组。示例如下:
```java
List<Person> persons = ...; // 假设有一个Person对象集合,每个对象都有一个city属性
Map<String, List<Person>> personByCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity)); // 根据city字段进行分组,返回一个Map<String, List<Person>>对象
```
`groupingBy()`方法接受一个Function作为参数,用于从集合中的每个对象中获取分组依据的值。在上面的例子中,我们使用`Person::getCity`方法引用作为分组依据。
如果想要对分组后的结果进行进一步的操作,可以使用`Collectors.toMap()`等操作。例如,可以统计每个城市的Person对象数量:
```java
Map<String, Long> personCountByCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.counting())); // 统计每个城市的Person对象数量,返回一个Map<String, Long>对象
```
`counting()`方法返回一个收集器,用于计算分组后的元素数量。在上面的例子中,我们将`counting()`方法作为第二个参数传递给`groupingBy()`方法。
阅读全文