使用 Java Stream 将列表转换为两层 Map

在 Java 开发中,使用 Stream API 来处理集合数据是一种非常高效与优雅的做法。今天,我们将学习如何将一个列表转换为两层 Map。具体来说,我们会从一个包含对象的列表中提取出两个属性,分别作为外层和内层 Map 的键。以下是整个过程的概述。

流程概述

首先,让我们梳理一下整个转换流程,并用表格展示步骤:

步骤 描述
1 准备一个对象类,包含我们需要的属性
2 创建一个对象列表并填充数据
3 使用 Java Stream 进行处理,将列表转换为两层 Map
4 打印生成的 Map 以验证结果

接下来,我们将逐步实现每个步骤。

步骤一:准备一个对象类

假设我们要处理一个 Person 类,它有 departmentname 这两个属性。代码如下:

public class Person {
    private String department;
    private String name;

    public Person(String department, String name) {
        this.department = department;
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public String getName() {
        return name;
    }
}
代码解释
  • Person 类定义了两个属性:departmentname
  • 我们提供了构造函数和 getter 方法用于初始化和访问这些属性。

步骤二:创建对象列表

接下来,我们创建一个包含多个 Person 对象的列表:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("IT", "Alice"));
        personList.add(new Person("HR", "Bob"));
        personList.add(new Person("IT", "Charlie"));
        // ...可以继续添加人员
    }
}
代码解释
  • 我们使用 ArrayList 来存储 Person 对象。
  • 添加一些示例数据,每个数据包代表部门及人员姓名。

步骤三:使用 Java Stream 进行处理

现在,我们使用 Java Stream 将列表转换为两层 Map。外层 Map 的 key 是 department,内层 Map 的 key 是 name,value 可以是 Person 对象。

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

Map<String, Map<String, Person>> resultMap = personList.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment, // 外层 Map 的 key
        Collectors.toMap(
            Person::getName, // 内层 Map 的 key
            person -> person // 内层 Map 的 value
        )
    ));
代码解释
  • stream() 方法用于将 personList 转换为流。
  • collect(Collectors.groupingBy(...)) 用于按部门分组,生成外层 Map。
  • Collectors.toMap(...) 用于将每个部门内人员的姓名映射到 Person 对象。

步骤四:打印生成的 Map

最后,我们打印生成的 Map,以验证结果:

System.out.println(resultMap);
代码解释
  • 使用 System.out.println() 来输出最终的 Map 结构,方便检查其内容。

状态图

接下来,我们用状态图来展示流程:

stateDiagram
    [*] --> CreateObjectClass
    CreateObjectClass --> CreateList
    CreateList --> StreamProcess
    StreamProcess --> PrintResult
    PrintResult --> [*]

结尾

通过以上步骤,我们成功地将一个包含 Person 对象的列表转换为了一个两层 Map。外层 Map 以部门为键,内层 Map 以姓名为键,值则是对应的 Person 对象。这种设计不仅在日常编码中十分常见,而且使用 Java Stream 的方式使代码简洁易读。希望这篇文章能对你理解 Java Stream 的使用有所帮助!