Stream流递归查询部门树

news2024/11/17 7:36:49

Java 递归查询树是很常见的功能,也有很多写法,小编这里记录stream流递归部门树写法,自从小编用上stream流之后,是爱不释手,的确是个不错的好东西,话不多说,直接上代码

第一步:先创建dept部门表,简单塞点数据
在这里插入图片描述
第二步:创建实体类

package com.example.work.entity;

import lombok.Data;

@Data
public class Dept {
    /**
    * 主键id
    */
    private Integer id;

    /**
    * 部门名称
    */
    private String deptName;

    /**
    * 父级id
    */
    private Integer parentId;
}

第三步:创建部门vo对象

package com.example.work.vo;

import com.example.work.entity.Dept;
import lombok.Data;

import java.util.List;

/**
 * @Description: 部门树vo
 * @Author: lyz
 * @CreateTime: 2024-01-11
 */
@Data
public class DeptTreeVO extends Dept {

    private List<DeptTreeVO> childrenList;
}

第三步:编写controller层

package com.example.work.controller;

import com.baomidou.mybatisplus.extension.api.R;
import com.example.work.service.DeptService;
import com.example.work.vo.DeptTreeVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Description: TODO
 * @Author: lyz
 * @CreateTime: 2024-01-11
 */
@RestController
@RequestMapping("dept")
public class DeptController {

    @Autowired
    DeptService deptService;

    /**
     * @Description: 部门树
     * @return R
     **/
    @GetMapping("/getTreeList")
    public R getTreeList(){
        List<DeptTreeVO> treeVOList = deptService.getTreeList();
        return R.ok(treeVOList);
    }
}

第四步:业务层代码逻辑实现

package com.example.work.service.impl;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.work.dao.DeptMapper;
import com.example.work.entity.Dept;
import com.example.work.service.DeptService;
import com.example.work.vo.DeptTreeVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description: TODO
 * @Author: lyz
 * @CreateTime: 2024-01-11
 */
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService {
    @Override
    public List<DeptTreeVO> getTreeList() {
        List<DeptTreeVO> deptTreeVOList = new ArrayList<>();
        List<Dept> list = this.list();
        list.forEach(dept -> {
            DeptTreeVO deptTreeVO = new DeptTreeVO();
            BeanUtils.copyProperties(dept, deptTreeVO);
            deptTreeVOList.add(deptTreeVO);
        });

        //获取父部门信息
        List<DeptTreeVO> deptTreeVOS = deptTreeVOList.stream().filter(x -> x.getParentId() == 0)
                .map(deptTreeVO -> {
                    deptTreeVO.setChildrenList(getChildrenList(deptTreeVO, deptTreeVOList));
                    return deptTreeVO;
                }).collect(Collectors.toList());

        return deptTreeVOS;
    }

    /**
     * @return List<DeptTreeVO> 子部门信息
     * @Description: 递归查询子部门
     * @param[1] root 父部门
     * @param[2] deptTreeVOList 所有部门
     **/
    private List<DeptTreeVO> getChildrenList(DeptTreeVO root, List<DeptTreeVO> deptTreeVOList) {
        List<DeptTreeVO> childrenList = deptTreeVOList.stream().filter(x -> {
            return Objects.equals(x.getParentId(), root.getId());
        }).map(deptTreeVO -> {
            deptTreeVO.setChildrenList(getChildrenList(deptTreeVO, deptTreeVOList));
            return deptTreeVO;
        }).collect(Collectors.toList());

        return childrenList;
    }
}

第五步:启动程序,并调用接口,结果如下
在这里插入图片描述
stream流递归查询部门树,你学会了吗

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

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

相关文章

用通俗易懂的方式讲解:大模型 RAG 技术,从入门到精通

本文基于IVAN ILIN发布于Towards AI的博客[1]进行总结归纳&#xff0c;感谢原作者的精彩讲解。 检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;简称RAG&#xff09;为大型语言模型&#xff08;LLMs&#xff09;提供了从某些数据源检索到的信息&#xff0…

RISC-V是如何与X86、ARM三分天下

目录 1.行业CPU指令集格局 2.汽车中的RISC-V进展 2.1 国际进展 2.2 国内进展 3.小结 2023年3月2日&#xff0c;在平头哥牵头举办的玄铁RISC-V生态大会上&#xff0c;工程院院士倪光南表示&#xff0c;基于RISC-V模块化、可扩展、容易定制、不受垄断制约等优势&#xff0c;…

2019年认证杯SPSSPRO杯数学建模C题(第一阶段)保险业的数字化变革全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于 CART 决策树和 SVR 的客户续保概率预测 C题 保险业的数字化变革 原题再现&#xff1a; 车险&#xff0c;即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度&#xff0c;车险即为分散机动车辆在行驶过程中可能发作的未知风…

SpringBoot多环境配置Maven Profile组

Maven profile组 注意切换配置时 mvn clean下 或者 clean 加install 或者compile 编译 clean之后 install下 或者compile 编译 nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar demo.jar --spring.profiles.activeprod > system.log 2>&1 &

2024年A特种设备相关管理(电梯)证考试题库及A特种设备相关管理(电梯)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年A特种设备相关管理&#xff08;电梯&#xff09;证考试题库及A特种设备相关管理&#xff08;电梯&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲…

Word不同部分(分节)设置页眉和页码的使用指南——附案例操作

Word页眉和页码分节设置的使用指南 目录 Word页眉和页码分节设置的使用指南摘要1. 插入分节符2. 设置不同的页眉3. 设置不同的页码4. 调整页码的起始值5. 删除或更改分节6. 预览和调整 摘要 在撰写word文档时&#xff0c;我们经常需要在不同的部分应用不同的页眉和页码格式。在…

靶机实战(10):OSCP备考之VulnHub Tre 1

靶机官网&#xff1a;Tre: 1[1] 实战思路&#xff1a; 一、主机发现二、端口发现&#xff08;服务、组件、版本&#xff09;三、漏洞发现&#xff08;获取权限&#xff09; 8082端口/HTTP服务 组件漏洞URL漏洞&#xff08;目录、文件&#xff09;80端口/HTTP服务 组件漏洞URL漏…

基于JAVA+ssm开发的在线报名系统设计与实现【附源码】

基于JAVAssm开发的在线报名系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

前端页面优化做的工作

1.分析模块占用空间 new (require(webpack-bundle-analyzer).BundleAnalyzerPlugin)() 2.使用谷歌浏览器中的layers&#xff0c;看下有没有影响性能的模块&#xff0c;或者应该销毁没销毁的 3.由于我们页面中含有很大的序列帧动画&#xff0c;所以会导致页面性能低&#xff0…

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled&#xff08;&#xff09;Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面&#xff0c;Promise 是一个对象…

九州金榜|为什么本科生“回炉”读职校?

近年来&#xff0c;“本科学历&#xff0b;技能证书”成为不少大学毕业生求职时的配置&#xff0c;本科毕业生“回炉”职业院校学习技能的现象引发社会关注。 为什么会引发这种现象发生呢&#xff1f;现在学校教育学的是理论知识&#xff0c;而“回炉”确实学习的实操&#xff…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…

钥匙翻转了一个面,该怎么识别匹配?

工业自动化中&#xff0c;我们经常遇到这样的问题&#xff0c;两面一样&#xff0c;上料时&#xff0c;翻转了&#xff0c;没人知道&#xff0c;该怎么匹配到&#xff1f;让机器人能抓取上&#xff1f; 两面相似&#xff0c;翻转了&#xff0c;该怎么识别匹配&#xff0c;来料…

GPT Store开业大吉:一场AI技术与创新的盛宴

就在1.11 日&#xff0c;ChatGPT 正式上线 GPT Store &#xff01; OpenAI CEO 山姆奥特曼第一时间确认了这个消息&#xff1a; 自从GPTs的概念提出以来&#xff0c;短短两个月内&#xff0c;全球用户已经创造了超过300万个GPTs。 点击 GPT Store 或者进入ChatGpt页面&am…

Arrow:在项目中进行时间处理的强大工具

目录 一、Arrow简介 二、安装与配置 三、基础功能与使用 1. 日期和时间格式转换 2. 时区处理 3. 时间序列分析 四、进阶应用与案例分析 五、性能与优化 六、最佳实践与经验分享 七、总结与展望 在处理日期和时间时&#xff0c;我们经常需要一个精确、可靠的库来帮助我…

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置!

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置&#xff01; 实际上&#xff0c;vue开发框架的时候&#xff0c;充分考虑到了前端开发人员可能会遇到的各种各样的情况&#xff0c;比如大家经常遇到的&#xff0c;数据类型的校验&#xff0c;再比如&#xff0c;默认…

多端多用户万能DIY商城系统源码:自营+多商户入驻商城系统 独立部署 带完整的安装代码包以及搭建教程

电子商务行业日新月异&#xff0c;许多企业希望能够通过线上商城拓展业务。但是&#xff0c;传统商城系统往往无法满足多样化、个性化的需求&#xff0c;而且开发周期长、成本高。罗峰就来给大家分享一款多端多用户万能DIY商城系统源码&#xff0c;搭建简单。 以下是部分代码示…

TypeScript进阶(四)声明文件

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

2024最新适用于 Windows 、Mac 的最佳屏幕录制软件

屏幕录制软件可以帮助我们录制 PC 和MacBook的实时屏幕视频。如果您想为 优酷录制视频&#xff0c;或者您正在为您的公司制作基于视频的项目&#xff0c;并且需要捕获屏幕的实时视频录制&#xff0c;那么我们在此列出了 一 款适合您的 Windows 、Mac的 2024 年最佳屏幕录制软件…