stream流多字段分组
时间: 2023-09-25 13:15:44 浏览: 91
可以使用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对象列表。
阅读全文