Java中,使用Stream API的Collectors.groupingBy方法可以有效地对列表进行分组。这是处理集合时非常有用的功能,尤其是当需要将列表中的元素根据某个属性或条件分组时。

以下是如何使用Collectors.groupingBy对一个Java列表进行分组的基本步骤和例子:

示例数据类

首先,假设我们有一个简单的数据类Person,它有两个属性:nameage

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐