Java Collectors.groupingBy详解
在Java中,Collectors.groupingBy
是非常常用的一个方法,它可以将Stream中的元素根据指定的条件进行分组。在本文中,我们将详细解释Collectors.groupingBy
的用法,并通过示例代码演示如何使用它。
语法与参数
Collectors.groupingBy
方法的语法如下:
public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)
其中,方法接收一个Function
类型的参数classifier
,用于指定分组条件。该方法返回一个Collector
对象,用于将Stream中的元素按照分组条件分组成Map
对象,其中Key为分组的条件,Value为属于该分组的元素的列表。
示例代码
接下来,我们通过一个示例代码来演示如何使用Collectors.groupingBy
方法。假设我们有一个Person
类,包含姓名和年龄属性,我们希望按照年龄将人员进行分组,代码如下:
import java.util.Map;
import java.util.List;
import java.util.stream.Collectors;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class GroupingByDemo {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 30)
);
Map<Integer, List<Person>> groupedByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
System.out.println(groupedByAge);
}
}
在上面的代码中,我们首先定义了一个Person
类,然后在GroupingByDemo
类的main
方法中创建了一个包含4个人员的列表。接着,我们使用Collectors.groupingBy
方法按照人员的年龄将人员进行分组,并将结果保存在groupedByAge
变量中。最后,我们输出了groupedByAge
的内容。
运行结果
当我们运行上面的示例代码时,将会得到如下输出:
{25=[Person{name='Alice', age=25}, Person{name='Charlie', age=25]}, 30=[Person{name='Bob', age=30}, Person{name='David', age=30}]}
输出将年龄作为Key,将属于该年龄的人员列表作为Value,成功实现了按照年龄分组的效果。
分组后的进一步操作
除了将元素进行简单的分组外,我们还可以对分组后的结果进行进一步操作。例如,我们可以对分组后的人员列表进行统计,并计算每个年龄段的人数。下面的示例代码演示了该操作:
import java.util.Map;
import java.util.List;
import java.util.stream.Collectors;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class GroupingByDemo {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 30)
);
Map<Integer, Long> groupedByAgeCount = people.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
System.out.println(groupedByAgeCount);
}
}
在上面的代码中,我们新增了一个groupedByAgeCount
变量,使用Collectors.counting()
方法来统计每个年龄段的人数。当我们运行该示例代码时,将会得到如下输出:
{25=2, 30=2}
输出显示了每个年龄段的人数,成功实现了对分组结果的统计操作。
小结
通过本文的介绍,相信读者对Java中的Collectors.groupingBy
方法有了更加深刻的理解。该方法在实际开发中非常常用,能够帮助开发人员快速、方便地对List、Set等集合进行分组操作。读者可以根据业务需要灵活运用该方法,提高开发效率。