Java stream多字段分组(groupingBy)
在Java中,可以使用Collectors.groupingBy
来实现多字段的分组。以下是一个简单的例子,假设我们有一个Person
类,我们想根据两个字段:年龄段和国籍进行分组。
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;
import static java.util.Map.Entry.*;
import static java.util.stream.Collectors.*;
class Person {
String name;
int age;
String country;
// 构造函数、getter和setter省略
}
public class GroupByExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30, "USA"),
new Person("Bob", 35, "USA"),
new Person("Charlie", 30, "UK"),
new Person("David", 35, "UK")
);
Map<String, Map<Integer, List<Person>>> grouped = people.stream()
.collect(groupingBy(
Person::getCountry,
groupingBy(Person::getAge)
));
grouped.forEach((country, ageGroup) -> {
ageGroup.forEach((age, peopleInAgeGroup) -> {
System.out.println("Country: " + country + ", Age: " + age + ", People: " + peopleInAgeGroup);
});
});
}
}
在这个例子中,我们首先根据国籍进行分组,然后在每个国籍组内,根据年龄进行分组。groupingBy
的第一个参数是外层分组的函数(这里是Person::getCountry
),第二个参数是内层分组的Collector
(这里是groupingBy(Person::getAge)
)。最终的grouped
变量是一个双层Map
,外层键是国籍,内层键是年龄,内层的值是所有具有相同国籍和年龄的人的列表。
评论已关闭