使用Java Stream API获取子部门的所有父级部门

使用Java Stream API获取子部门的所有父级部门

过了腊八就是年
车票
订了吗?想家了吧.....

在数据库表中,经常会有包含层次结构的部门信息表。本博客将使用Java语言和Stream API演示如何获取给定子部门的所有父级部门,并在代码中加入详细注释。

1. 创建 Department 类

首先,我们需要定义一个类来表示部门信息。Department类包含三个属性:idnameparentId,分别表示部门的唯一标识、名称和父级部门的标识。

java 复制代码
public class Department {
    private long id;
    private String name;
    private long parentId;

    // 构造函数
    public Department(long id, String name, long parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }

    // Getter和Setter方法省略
}

2. 编写 DepartmentUtils 类

接下来,我们创建一个DepartmentUtils类,其中包含一个静态方法getParentDepartments,该方法使用递归调用来获取给定子部门的所有父级部门。注释将详细解释每个关键步骤。

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class DepartmentUtils {

    /**
     * 获取给定子部门的所有父级部门
     *
     * @param allDepartments 包含所有部门信息的列表
     * @param childDepartmentId 给定子部门的ID
     * @return 包含所有父级部门的列表
     */
    public static List<Department> getParentDepartments(List<Department> allDepartments, long childDepartmentId) {
        // 使用递归调用获取所有父级部门
        return getParentDepartmentsRecursively(allDepartments, childDepartmentId)
                .stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
    }

    /**
     * 递归方法:获取给定子部门的所有父级部门
     *
     * @param allDepartments 包含所有部门信息的列表
     * @param childDepartmentId 给定子部门的ID
     * @return 包含所有父级部门的列表
     */
    private static List<Department> getParentDepartmentsRecursively(List<Department> allDepartments, long childDepartmentId) {
        // 查找给定ID的子部门
        Optional<Department> childDepartment = allDepartments.stream()
                .filter(d -> d.getId() == childDepartmentId)
                .findFirst();

        if (childDepartment.isPresent()) {
            // 查找子部门的父部门
            Department parentDepartment = allDepartments.stream()
                    .filter(d -> Objects.equals(d.getId(), childDepartment.get().getParentId()))
                    .findFirst()
                    .orElse(null);

            if (parentDepartment != null) {
                // 递归调用,获取父部门的所有父级部门
                List<Department> parentDepartments = getParentDepartmentsRecursively(allDepartments, parentDepartment.getId());

                // 合并当前父部门和其所有父级部门
                return Stream.concat(Stream.of(parentDepartment), parentDepartments.stream())
                        .collect(Collectors.toList());
            }
        }

        // 如果子部门或其父部门未找到,返回空列表
        return new ArrayList<>();
    }
}

3. 使用示例

最后,我们创建一个使用示例,演示如何调用DepartmentUtils类来获取子部门的所有父级部门。这个示例包含了一个包含部门信息的列表,并打印了结果。

java 复制代码
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 创建部门信息列表
        List<Department> allDepartments = Arrays.asList(
                new Department(1, "部门A", 0),
                new Department(2, "部门B", 1),
                new Department(3, "部门C", 2),
                // 添加其他部门信息
        );

        // 选择一个子部门的ID进行查询
        long childDepartmentId = 3;

        // 获取子部门的所有父级部门
        List<Department> parentDepartments = DepartmentUtils.getParentDepartments(allDepartments, childDepartmentId);

        // 打印结果
        System.out.println("子部门的所有父级部门:");
        parentDepartments.forEach(department -> System.out.println(department.getName()));
    }
}

4. 避免 NullPointerException

在代码中,我们对可能导致NullPointerException的情况进行了处理,确保在访问属性之前检查了null值。如果子部门或其父部门未找到,我们返回一个空列表而不是null,以避免潜在的异常。

相关推荐
-曾牛8 小时前
基于微信小程序的在线聊天功能实现:WebSocket通信实战
前端·后端·websocket·网络协议·微信小程序·小程序·notepad++
charlie11451419110 小时前
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
arm开发·qt·学习·pdf·教程·设计·qt6
Warren9810 小时前
Java面试八股Spring篇(4500字)
java·开发语言·spring boot·后端·spring·面试
背帆10 小时前
go的interface接口底层实现
开发语言·后端·golang
IT成长史11 小时前
deepseek梳理java高级开发工程师springboot面试题2
java·spring boot·后端
qq_2663487312 小时前
springboot AOP中,通过解析SpEL 表达式动态获取参数值
java·spring boot·后端
bing_15812 小时前
MQTT 在Spring Boot 中的使用
java·spring boot·后端·mqtt
阑梦清川15 小时前
关于Go语言的开发环境的搭建
开发语言·后端·golang
lyrhhhhhhhh16 小时前
Spring 模拟转账开发实战
java·后端·spring
tonngw16 小时前
【Mac 从 0 到 1 保姆级配置教程 12】- 安装配置万能的编辑器 VSCode 以及常用插件
git·vscode·后端·macos·开源·编辑器·github