stream流按照字段分组
时间: 2023-10-18 12:06:52 浏览: 79
要按照字段分组,可以使用Java 8中的Collectors.groupingBy()方法。此方法接受一个Function参数,用于指定按照哪个字段进行分组。以下是一个示例代码:
```java
List<Person> persons = Arrays.asList(
new Person("Alice", 20),
new Person("Bob", 25),
new Person("Charlie", 30),
new Person("Alice", 35)
);
Map<String, List<Person>> personsByNames = persons.stream()
.collect(Collectors.groupingBy(Person::getName));
System.out.println(personsByNames);
```
上述代码将Person对象按照名称字段进行分组,并将结果存储在一个Map<String, List<Person>>中。输出结果如下:
```
{Alice=[Person{name='Alice', age=20}, Person{name='Alice', age=35}], Bob=[Person{name='Bob', age=25}], Charlie=[Person{name='Charlie', age=30}]}
```
可以看到,同名的Person对象被分组在一起,存储在List中。
相关问题
stream流多字段分组
可以使用Java 8的流(Stream)API实现多字段分组。下面是一个示例代码:
```java
List<Person> persons = Arrays.asList(
new Person("Alice", "female", 25),
new Person("Bob", "male", 30),
new Person("Charlie", "male", 35),
new Person("David", "male", 40),
new Person("Eve", "female", 45),
new Person("Frank", "male", 50)
);
Map<String, Map<String, List<Person>>> groups = persons.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.groupingBy(p -> p.getAge() < 30 ? "young" : "old")));
groups.forEach((gender, subGroups) -> {
System.out.println("Gender: " + gender);
subGroups.forEach((ageGroup, people) -> {
System.out.println(" Age group: " + ageGroup);
people.forEach(System.out::println);
});
});
```
在这个例子中,我们首先创建了一个包含Person对象的列表。然后,我们使用流API的`groupingBy`方法将这个列表按照性别和年龄分成多个子组。最后,我们遍历这些子组并输出它们的内容。
结果输出如下:
```
Gender: female
Age group: young
Person{name='Alice', gender='female', age=25}
Age group: old
Person{name='Eve', gender='female', age=45}
Gender: male
Age group: young
Person{name='Bob', gender='male', age=30}
Person{name='Charlie', gender='male', age=35}
Age group: old
Person{name='David', gender='male', age=40}
Person{name='Frank', gender='male', age=50}
```
上述代码中,我们首先按照性别分组,然后按照年龄是否小于30岁分组。因此,最终的结果是一个嵌套的Map,其中外层Map的键是性别,内层Map的键是年龄分组标志,值是Person对象列表。
java stream流根据字段分组
Java中的Stream API提供了强大的数据处理能力,其中的`Collectors.groupingBy`是一个非常实用的收集器,用于根据指定的分类函数对流中的元素进行分组。分组后的结果是一个Map,其中键是分类函数的返回值,值是根据分类函数值分组的流元素的列表。
以下是一个简单的例子,展示了如何使用`groupingBy`进行分组:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupByExample {
public static void main(String[] args) {
List<Person> roster = Arrays.asList(
new Person("张三", "工程师"),
new Person("李四", "设计师"),
new Person("王五", "工程师"),
new Person("赵六", "设计师")
);
Map<String, List<Person>> groupByOccupation = roster.stream()
.collect(Collectors.groupingBy(Person::getOccupation));
System.out.println(groupByOccupation);
}
}
class Person {
private String name;
private String occupation;
public Person(String name, String occupation) {
this.name = name;
this.occupation = occupation;
}
public String getName() {
return name;
}
public String getOccupation() {
return occupation;
}
}
```
在这个例子中,我们有一个`Person`类的对象列表`roster`,其中包含人的姓名和职业。我们使用`groupingBy(Person::getOccupation)`按职业对人员列表进行分组。结果是一个Map,键是职业名称,值是具有相同职业的所有`Person`对象的列表。
使用`groupingBy`分组通常有以下几种形式:
1. 直接使用分类函数进行分组。
2. 使用`groupingBy`结合`Collectors.counting()`统计每个分组的数量。
3. 使用`groupingBy`结合`Collectors.mapping()`来收集分组元素的特定属性。
阅读全文