Java Stream Collectors.groupingBy实现对List(列表)进行分组的方法
Java中,使用StreamAPI的方法可以有效地对列表进行分组。这是处理集合时非常有用的功能,尤其是当需要将列表中的元素根据某个属性或条件分组时。以下是如何使用。
Java中,使用Stream
API的Collectors.groupingBy
方法可以有效地对列表进行分组。这是处理集合时非常有用的功能,尤其是当需要将列表中的元素根据某个属性或条件分组时。
以下是如何使用Collectors.groupingBy
对一个Java列表进行分组的基本步骤和例子:
示例数据类
首先,假设我们有一个简单的数据类Person
,它有两个属性:name
和age
。
public 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 +
'}';
}
}
使用groupingBy
我们可以按照Person
的某个属性(例如age
)将一个Person
列表分组。
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 22),
new Person("Bob", 20),
new Person("Charlie", 22),
new Person("David", 20),
new Person("Eve", 30)
);
// 按年龄分组
Map<Integer, List<Person>> groupedByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
// 输出分组结果
groupedByAge.forEach((age, persons) -> {
System.out.println("Age " + age + ": " + persons);
});
}
}
输出
这将输出类似下面的内容,显示列表按年龄被成功分组:
Age 20: [Person{name='Bob', age=20}, Person{name='David', age=20}]
Age 22: [Person{name='Alice', age=22}, Person{name='Charlie', age=22}]
Age 30: [Person{name='Eve', age=30}]
高级用法
groupingBy
也支持更复杂的分组策略,如多级分组(分组后再次分组)和使用下游收集器。
多级分组
例如,如想先按年龄分组,再按名字的首字母分组:
Map<Integer, Map<Character, List<Person>>> result = people.stream()
.collect(Collectors.groupingBy(Person::getAge,
Collectors.groupingBy(p -> p.getName().charAt(0))));
使用其他收集器
如只对每个年龄组的人数感兴趣:
Map<Integer, Long> countByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
参考文档:Java Stream Collectors.groupingBy实现对List(列表)进行分组的方法-CJavaPy
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)