Stream流递归查询部门树

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 {@AutowiredDeptService 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 {@Overridepublic 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.hqwc.cn/news/341328.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins基础篇--添加用户和用户权限设置

添加用户 点击系统管理&#xff0c;点击管理用户&#xff0c;然后点击创建用户&#xff08;Create User&#xff09; 用户权限管理 点击系统管理&#xff0c;点击全局安全配置&#xff0c;找到授权策略&#xff0c;选择安全矩阵&#xff0c;配置好用户权限后&#xff0c;点击…

vue3移动端实现pdf预览

第一种方式&#xff1a;使用vue-pdf-embed和vue3-pdfjs 使用的插件有&#xff1a; npm i vue-pdf-embed npm i vue3-pdfjshtml部分&#xff1a; <div ref"preRef" v-loading"loading" class"pdf-preview"><div v-if"pdfState.so…

C++算法学习心得五.二叉树(3)

1.合并二叉树&#xff08;617题&#xff09; 题目要求&#xff1a; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们…

Vue面试之组件通信的方式总结(下篇)

Vue面试之组件通信的方式总结 $refprovide&injectprovideinject EventBus事件总线vuex 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ 在Vue框架中&…

CSS 选择器全攻略:从入门到精通(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

制造领域 基础概念快速入门介绍

1、基本背景知识 本定义结合国家标准文件有所发挥&#xff0c;仅供参考。 产品&#xff1a;是生产企业向用户或市场以商品形式提供的制成品&#xff1b; 成套设备&#xff1a;在生产企业一般不用装配工序连接&#xff0c;但用于完成相互联系的使用功能的两个或两个以上的产…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

Java填充Execl模板并返回前端下载

功能&#xff1a;后端使用Java POI填充Execl模板&#xff0c;并返回前端下载 Execl模板如下&#xff1a; 1. Java后端 功能&#xff1a;填充模板EXECL,并返回前端 controller层 package org.huan.controller;import org.huan.dto.ExcelData; import org.huan.util.ExcelT…

c++qt-基本组件

1. Designer 设计师&#xff08;掌握&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存的文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建项目时&#xff0c;选中…

Elasticsearch倒排索引详解

倒排索引&#xff1a; 组成 term index(词项索引 &#xff0c;存放前后缀指针) Term Dictionary&#xff08;词项字典&#xff0c;所有词项经过文档与处理后按照字典顺序组成的一个字典&#xff08;相关度&#xff09;&#xff09; Posting List&#xff08;倒排表&#xf…

Logback框架基本认识

文章目录 一.什么是Logback1.1 初识Logbcak 二.Logbcak的结构三.日志的级别四.配置组件详解4.1 logger 日志记录器属性的介绍如何在配置文件里配置 4.2 appender 附加器 配合日志记录器的输出格式4.2.1 控制台附加器4.2.2 文件附加器4.3.3滚动文件附加器 4.3 Filter: 过滤器&am…

Python-基础语法

标识符 第一个字符必须是字母表中字母或下划线 _ 。标识符的其他的部分由字母、数字和下划线组成。标识符对大小写敏感。在 Python 3 中&#xff0c;可以用中文作为变量名&#xff0c;非 ASCII 标识符也是允许的了。 python保留字 保留字即关键字&#xff0c;我们不能把它们用…