groupingBy
收集器是 Java 8 Stream API 中的一个功能强大的工具,它主要用于根据某个属性对流中的元素进行分组,从而创建一个映射(Map),其中键是分组的依据,值是具有相同键的元素列表。如果你想要创建一个对象列表而不是映射,你可以对 groupingBy
的结果进行进一步处理。
以下是一个简单的例子,说明如何使用 groupingBy
收集器,并最终得到一个对象列表:
假设我们有一个 Person
类,它有两个属性:name
和 age
。我们想要根据年龄分组,并得到一个包含每个年龄段的人的列表。
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class GroupingByExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 30)
);
// 使用 groupingBy 收集器按年龄分组
Map<Integer, List<Person>> peopleByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
// 将分组结果转换为对象列表
List<List<Person>> groupedPeopleList = new ArrayList<>(peopleByAge.values());
// 打印结果
groupedPeopleList.forEach(group -> {
System.out.println("Age group: " + group.get(0).getAge());
group.forEach(System.out::println);
System.out.println();
});
}
}
在这个例子中,我们首先使用 groupingBy
收集器按 Person
对象的 age
属性进行分组,得到一个映射,其中键是年龄,值是具有相同年龄的 Person
对象列表。然后,我们通过获取映射的值集合(values()
),将其转换为一个对象列表(List<List<Person>>
)。
输出结果将是:
Age group: 25
Person{name='Alice', age=25}
Person{name='Charlie', age=25}
Age group: 30
Person{name='Bob', age=30}
Person{name='David', age=30}
这样,你就得到了一个包含不同年龄段人群的列表,而不是一个映射。
如果你遇到的问题是 groupingBy
收集器的使用出现了错误,可能的原因包括:
Person::getAge
)返回了不一致的类型,导致编译错误。null
,而 groupingBy
不支持 null
键。解决方法:
null
元素。希望这个答案能帮助你理解如何使用 groupingBy
收集器,并解决你在使用过程中可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云