Java根据List对某个属性进行分组

在Java开发中,我们经常需要对一个List中的元素按照某个属性进行分组。这种分组操作可以帮助我们快速地对数据进行分类统计或者进行其他处理。本文将介绍如何使用Java的Stream API和Collections工具类来实现根据List对某个属性进行分组的操作。

1. 示例代码

首先,我们来看一下实现根据List对某个属性进行分组的示例代码:

import java.util.*;
import java.util.stream.Collectors;

public class GroupByDemo {

    public static void main(String[] args) {
        // 创建一个包含学生信息的List
        List<Student> students = Arrays.asList(
                new Student("Tom", "Math"),
                new Student("Jerry", "Physics"),
                new Student("Alice", "Math"),
                new Student("Bob", "Chemistry"),
                new Student("John", "Physics"),
                new Student("Lisa", "Chemistry")
        );

        // 根据专业对学生进行分组
        Map<String, List<Student>> groupedStudents = students.stream()
                .collect(Collectors.groupingBy(Student::getMajor));

        // 输出分组结果
        for (Map.Entry<String, List<Student>> entry : groupedStudents.entrySet()) {
            System.out.println("Major: " + entry.getKey());
            for (Student student : entry.getValue()) {
                System.out.println("  - " + student.getName());
            }
        }
    }

    static class Student {
        private String name;
        private String major;

        public Student(String name, String major) {
            this.name = name;
            this.major = major;
        }

        public String getName() {
            return name;
        }

        public String getMajor() {
            return major;
        }
    }
}

在上述示例代码中,我们创建了一个包含学生信息的List,然后使用Stream API的Collectors.groupingBy方法根据学生的专业进行分组。最后,我们遍历分组结果并输出每个分组中的学生姓名。

2. 分组原理

在Java中,我们可以使用Collectors.groupingBy方法对一个Stream进行分组操作。该方法接受一个Function作为参数,用于提取元素的分组依据。在上述示例代码中,我们使用Student::getMajor作为分组依据,即根据学生的专业进行分组。

Collectors.groupingBy方法返回一个Map类型的结果,其中键为分组依据的值,值为一个List,包含属于该分组的所有元素。

3. 序列图

下面是根据List对某个属性进行分组的操作的序列图示例:

sequenceDiagram
    participant Main
    participant StreamAPI
    participant Collections
    participant List
    participant Map

    Main->>StreamAPI: 创建Stream
    StreamAPI-->>Collections: 调用groupingBy方法
    Collections-->>List: 遍历List获取元素
    List-->>StreamAPI: 将元素加入Stream
    StreamAPI-->>Collections: 执行分组操作
    Collections-->>Map: 返回分组结果
    Map-->>Main: 返回分组结果
    Main->>Map: 遍历分组结果
    Map->>Main: 输出分组结果

根据上述序列图可以看出,我们首先创建一个Stream对象,然后调用Collectors.groupingBy方法来执行分组操作,最后返回分组结果。然后,我们遍历分组结果并输出。

4. 甘特图

下面是根据List对某个属性进行分组的操作的甘特图示例:

gantt
    dateFormat  YYYY-MM-DD
    title 根据List对某个属性进行分组
    section 创建Stream
    创建Stream对象   : 2022-01-01, 1d
    section 执行分组操作
    调用groupingBy方法 : 2022-01-02, 1d
    遍历List获取元素  : 2022-01-03, 1d
    将元素加入Stream : 2022-01-03, 1d
    执行分组操作     : 2022-01-04, 2d
    返回分组结果     : 2022-01-06, 1d
    section 遍历分组结果
    遍历分组结果     : 2022-01-07, 1d
    输出分组结果