Java Collectors.groupingBy详解

Java Collectors.groupingBy详解

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等集合进行分组操作。读者可以根据业务需要灵活运用该方法,提高开发效率。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程