📜  Java中的 Collectors groupingBy() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:16:21.821000             🧑  作者: Mango

Java中的 Collectors groupingBy() 方法及示例

在Java 8中,我们可以使用流(Stream)和收集器(Collectors)来对数据进行处理和统计。其中,收集器(Collectors)是用于将流(Stream)中的元素转化为集合,该集合可以是List、Set、Map等。

在Collectors中,有一个groupingBy()方法,它可以根据给定的函数将流(Stream)中的元素进行分组,返回一个Map类型的结果。groupingBy()方法非常适合用于将数据按某个属性分类统计的场景。

下面,让我们通过实例来感受Java中的 Collectors groupingBy() 方法。

示例

假设我们有一个Person类,其中包含了姓名(name)和年龄(age)两个属性。现在,我们想要按照年龄对Person对象进行分组,统计每个年龄段的Person数目。

1. 构造数据

我们先构造一些Person对象作为数据源。为了简化,我们只使用了两个年龄段。

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;
    }
}
List<Person> personList = new ArrayList<>();
personList.add(new Person("张三", 18));
personList.add(new Person("李四", 20));
personList.add(new Person("王五", 19));
personList.add(new Person("赵六", 20));
2. 使用groupingBy()分组统计

接下来,我们使用groupingBy()方法对Person对象进行分组,并统计每个年龄段的Person数目。

Map<Integer, Long> result = personList.stream().collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
System.out.println(result);

代码解释:

  • Person::getAge表示以Person对象的age作为分组依据;
  • Collectors.counting()表示统计每个分组的元素数量。

输出结果:

{18=1, 19=1, 20=2}

说明:

  • age为18的Person只有一个;
  • age为19的Person只有一个;
  • age为20的Person有两个。

这样,我们就使用groupingBy()方法对Person对象进行了分组统计。

总结

Java中的 Collectors groupingBy() 方法是一个非常有用的函数,它可以根据给定的函数将流(Stream)中的元素进行分组,返回一个Map类型的结果。groupingBy()方法非常适合用于将数据按某个属性分类统计的场景。