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

news2024/12/1 0:32:32

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

在这里插入图片描述

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

1. 创建 Department 类

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

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,该方法使用递归调用来获取给定子部门的所有父级部门。注释将详细解释每个关键步骤。

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类来获取子部门的所有父级部门。这个示例包含了一个包含部门信息的列表,并打印了结果。

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,以避免潜在的异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程 和之前实现的YOLOv1一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv2的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv2检测器&#xff0c;来对YOLOV2有…

ADA-YOLO:YOLOv8+注意力+Adaptive Head,mAP提升3%

生物医学图像分析中的目标检测和定位至关重要&#xff0c;尤其是在血液学领域&#xff0c;检测和识别血细胞对于诊断和治疗决策至关重要。虽然基于注意力的方法在各个领域中目标检测方面取得了显著的进展&#xff0c;但由于医学影像数据集的独特挑战&#xff0c;其在医学目标检…

cookie和session的工作过程和作用:弥补http无状态的不足

cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时&#xff0c;服务端可以把状态数据以key-value的形式写入到cookie中&#xff0c;存储到浏览器。浏览器下次去服务服务端时&#xff0c;就可以把这些状态数据携带给服务器端&#xff0c;服务器端可以根…

C++I/O流——(3)文件输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

HBase学习二:RegionServer详解

1、内部结构 RegionServer是HBase系统中最核心的组件&#xff0c;主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系&#xff0c;包含多个各司其职的核心模块&#xff1a;HLog、MemStore、HFile以及BlockCache。 2、HLog 3、MemStore 4、HFile…

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

目录 前言 一、膨胀&#xff08;Dilation&#xff09;与 腐蚀&#xff08;Erosion&#xff09; 二、形态学操作 1、开操作&#xff08;Opening&#xff09; 2、闭操作&#xff08;Closing&#xff09; 3、形态学梯度&#xff08;Morphological Gradient&#xff09; 4、…

【数学建模】美赛备战笔记 01 美赛指南与竞赛全流程

美赛指南 整篇论文需要在25页内。 六道赛题特点&#xff1a; A、B题涉及到微分方程和物理概念较多&#xff0c;需要一定的专业知识&#xff1b; C题常常涉及到时间序列、机器学习&#xff1b; D题一般是运筹学/网络科学&#xff0c;图论、优化问题&#xff0c;涉及到的概念多…

计算机视觉的应用

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

【C++11】部分新特性

目录 1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化1.2 std::initializer_list 2. 声明2.1 auto2.2 decltype 3. nullptr4. 右值引用和移动语义4.1 左值引用和右值引用4.2 左右值引用比较4.3 右值引用使用场景和意义4.4 完美转发 5. 新的类功能6. lambda表达式6.1 语…

vue安装、打包、发布

一.安装&#xff1a; 打开cmd命令行依次输入下面命令&#xff1a; 1. npm install -g vue/cli 2. vue create vue-demo(项目名) 3. 运行项目 npm run serve 二.打包&#xff1a; 在vscode打开终端输入以下命令&#xff1a; npm run build 打包成功后会生成一个dist文件夹&…

Python图像处理【18】边缘检测详解

边缘检测详解 0. 前言1. 图像导数2. LoG/zero-crossing2.1 Marr-Hildteth 算法 3. Canny 与 holistically-nested 算法3.1 Canny 边缘检测3.2 holistically-nested 边缘检测 小结系列链接 0. 前言 边缘是图像中两个区域之间具有相对不同灰级特性的边界&#xff0c;或者说是亮度…

好用的内外网快速传输大文件方法

在信息化时代&#xff0c;数据已经成为各行各业的关键资产&#xff0c;数据的传输和交换方式直接影响着数据价值的体现。在众多场景下&#xff0c;我们需要在不同的网络环境中进行文件传输&#xff0c;如同一个局域网内或者互联网上。这时涉及到内外网的概念。 内外网指的是在不…

PromptCast-时间序列预测的好文推荐

前言 这是关于大语言模型和时间序列预测结合的好文推荐&#xff0c;发现这篇文章&#xff0c;不仅idea不错和代码开源维护的不错&#xff0c;论文也比较详细&#xff08;可能是顶刊而不是顶会&#xff0c;篇幅大&#xff0c;容易写清楚&#xff09;&#xff0c;并且关于它的Br…

架构篇02-架构设计的历史背景

文章目录 机器语言&#xff08;1940 年之前&#xff09;汇编语言&#xff08;20 世纪 40 年代&#xff09;高级语言&#xff08;20 世纪 50 年代&#xff09;第一次软件危机与结构化程序设计&#xff08;20 世纪 60 年代~20 世纪 70 年代&#xff09;第二次软件危机与面向对象&…

什么是防火墙?

目录 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f;防火墙与交换机、路由器对比防火墙和路由器实现安全控制的区别防火墙的发展史1989年至1994年1995年至2004年2005年至今 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f; “防火墙”一词起源于建筑领域&#x…

十一、Qt Poppler打包

《一、QT的前世今生》 《二、QT下载、安装及问题解决(windows系统)》《三、Qt Creator使用》 ​​​ 《四、Qt 的第一个demo-CSDN博客》 《五、带登录窗体的demo》 《六、新建窗体时&#xff0c;几种窗体的区别》 《七、Qt 信号和槽》 《八、Qt C 毕业设计》 《九、Qt …

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能&#xff08;C&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和短曝光功能的技术背景Baumer工业相机通过NEOAPI SDK使用相机日志跟踪功能1.引用合适的类文件2.通过NEOAPI SDK使用相机日志跟踪功能3.通…

java绩效考核系统

一、系统介绍 本系统为绩效考核系统&#xff0c;系统分为三大模块&#xff1a;考核设置&#xff0c;绩效考核&#xff0c;系统管理。 可满足小企业对员工进行考核。本系统最大特色是有强大和灵活的权限控制功能&#xff0c;所有菜单&#xff0c;按钮功能均可由管理通过配置来控…

【开源】基于JAVA语言的网上药店系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)

前面分享了平台对运维效率提升的重要性和挑战以及基于大模型的平台建设解决方案&#xff0c;新来的朋友点这里&#xff0c;一键回看精彩原文。 基于大模型构建高效的运维知识及智能问答平台&#xff08;1&#xff09;https://mp.csdn.net/mp_blog/creation/editor/135223109 …