Java 8 中的 Stream 轻松遍历树形结构

在平时的需求开发中,我们经常会遍历一些树形结构,数据库中使用父id来关联,为了降低数据库的查询压力,我们可以使用java8中的Stream流一次性把数据查出来,然后通过流式处理。
实体类:Menu.java

package com.example.tree;import java.util.List;/*** 菜单实体类* @date: 2023/12/28**/
public class Menu {private Integer id;private String name;private Integer parentId;private List<Menu> childList;public Menu(Integer id, String name, Integer parentId) {this.id = id;this.name = name;this.parentId = parentId;}public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {this.id = id;this.name = name;this.parentId = parentId;this.childList = childList;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getParentId() {return parentId;}public void setParentId(Integer parentId) {this.parentId = parentId;}public List<Menu> getChildList() {return childList;}public void setChildList(List<Menu> childList) {this.childList = childList;}
}

模拟查看数据库所有数据到List里面
测试类:testTree.java

package com.example.tree;import com.alibaba.fastjson.JSON;import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;/*** 测试树* @date: 2023/12/28**/
public class testTree {public static void main(String[] args) {List<Menu> menuList = Arrays.asList(new Menu(1,"根节点",0),new Menu(2,"子节点1",1),new Menu(3,"子节点1.1",2),new Menu(4,"子节点1.2",2),new Menu(5,"根节点1.3",2),new Menu(6,"根节点2",1),new Menu(7,"根节点2.1",6),new Menu(8,"根节点2.2",6),new Menu(9,"根节点2.2.1",7),new Menu(10,"根节点2.2.2",7),new Menu(11,"根节点3",1),new Menu(12,"根节点3.1",11));//获取父节点List<Menu> collect = menuList.stream().filter(m -> m.getParentId() == 0).map((m) -> {m.setChildList(getChildrens(m,menuList));return m;}).collect(Collectors.toList());System.out.println("============转json输出结果:");System.out.println(JSON.toJSON(collect));}/*** 递归查询子节点* @param root 根节点* @param all 所有节点* @return 根节点信息* @date 2023/12/28*/private static List<Menu> getChildrens(Menu root, List<Menu> all) {List<Menu> children = all.stream().filter(m -> {return Objects.equals(m.getParentId(),root.getId());}).map((m) -> {m.setChildList(getChildrens(m,all));return m;}).collect(Collectors.toList());return children;}
}

打印结果:

[{"name":"根节点","childList":[{"name":"子节点1","childList":[{"name":"子节点1.1","childList":[],"id":3,"parentId":2},{"name":"子节点1.2","childList":[],"id":4,"parentId":2},{"name":"根节点1.3","childList":[],"id":5,"parentId":2}],"id":2,"parentId":1},{"name":"根节点2","childList":[{"name":"根节点2.1","childList":[{"name":"根节点2.2.1","childList":[],"id":9,"parentId":7},{"name":"根节点2.2.2","childList":[],"id":10,"parentId":7}],"id":7,"parentId":6},{"name":"根节点2.2","childList":[],"id":8,"parentId":6}],"id":6,"parentId":1},{"name":"根节点3","childList":[{"name":"根节点3.1","childList":[],"id":12,"parentId":11}],"id":11,"parentId":1}],"id":1,"parentId":0}
]

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

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

相关文章

Django 中集成 CKEditor 富文本编辑器详解

概要 在 Web 应用中&#xff0c;富文本编辑器是提高用户体验的重要组件之一。CKEditor 是一款流行的、功能丰富的富文本编辑器。在 Django 项目中集成 CKEditor 不仅可以提升内容编辑的灵活性&#xff0c;还能丰富用户的互动体验。本文将详细介绍如何在 Django 中集成和配置 C…

Apache Commons JCS缓存解决方案

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff01;今天&#xff0c;咱们来聊聊Apache Commons JCS&#xff0c;一个Java界里的缓存大杀器。缓存技术&#xff0c;对于提高应用性能来说&#xff0c;就像是给它加了一剂兴奋剂&#xff0c;能让数据访问变得快如闪电。…

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发&#xff08;以为tcp作为讲解&#xff0c;udp类似&#xff09; 选择转发器 输入监听地址&#xff08;SRC地址&#xff09;和端口 输入转发地址&am…

零基础学Java第三天

复习与回顾&#xff1a; 1.八大基本数据类型整型: byte short int long浮点: float double字符: char布尔: boolean2.声明整型和浮点和布尔类型的数据 一个变量数据类型 变量名字 初始化的值;int a 234;float f1 34.5f;double d1 782.9;boolean b1 true;3.变量名…

深度学习核心技术与实践之深度学习基础篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分 神经网络 生物神经元的特点 &#xff08;1&#xff09;人体各种神经元本身的构成很相似 &#xff08;2&#xff09;早期的大脑损伤&#xff0c;其功能可能是以其他部位的神经元来代替实现的 &#xff08;3&#x…

nmap扫描和MS17-010(永恒之蓝)漏洞攻击

情况介绍 攻击机kali中使用ifconfig可以看到ip是192.168.0.106。 靶机Window 7使用ipconfig可以看到ip是192.168.0.100。 Nmap Nmap全称为Network Mapper&#xff0c;又成为“上帝之眼”&#xff0c;可以扫描ip和端口。 然后在kali攻击机上使用nmap 192.168.0.103可以看…

一元函数微分学——刷题(2

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 这个题目可能看上去比较吓人&#xff0c;但是&#xff0c;又很简单&#xff1b;因为一切都太明确了&#xff0c;跟着我仔细看一下&…

SpingBoot的项目实战--模拟电商【2.登录】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

基于SpringBoot的校园生活服务平台

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的校园生活服务平台,java…

目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度&#xff0c;损失函数越小&#xff0c;通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段&#xff0c;如果我们想让预测值无限接近于真实值&#xff0c;就需要将损失值降到最低…

uniApp中uView组件库的丰富布局方法

目录 基本使用 #分栏间隔 #混合布局 #分栏偏移 #对齐方式 API #Row Props #Col Props #Row Events #Col Events UniApp的uView组件库是一个丰富的UI组件库&#xff0c;提供了各种常用的UI组件和布局方法&#xff0c;帮助开发者快速构建美观、灵活的界面。下面给你写一…

ES6语法(四)class类 数值扩展方法对象扩展方法介绍

1. Class类 es6引入了类Class 的概念&#xff0c;作为对象的模板。可以使用Class关键字定义类&#xff0c;通过类实例化对象。   Class类可以看做是一个语法糖&#xff0c;绝大部分功能也可以通过es5做到。   Class写法只是让对象原型的写法更加清晰、更像面向对象变成的语…

通过代码启动 uiautomatorviewer

目录 一、前置说明1、总体目录2、相关回顾3、本节目标二、操作步骤1、目录设置2、代码实现1)ProcessManager 类:添加 is_running 方法2)UIAutomatorViewer类:提供 start、stop方法3、测试代码4、日志输出三、后置说明1、要点小结2、下节预告

C++设计模式 #8 抽象工厂(Abstract Factory)

抽象工厂这个名字比较难以帮助理解&#xff0c;可以把抽象工厂理解为“品牌工厂”或者“家族工厂”。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。如…

查看各个文件夹大小的linux命令

可以使用 du 命令来查看当前各个文件夹的大小。以下是一些常用的 du 命令选项&#xff1a; du&#xff1a;显示当前目录下所有文件和文件夹的大小。 du -h&#xff1a;以人类可读的方式显示文件夹大小&#xff0c;以 K、M、G 等单位表示。 du -s&#xff1a;显示每个目录的总大…

C# 常用数据类型及取值范围

1.常见数据类型和取值范围 序号数据类型占字节数取值范围1byte10 到 2552sbyte1-128 到 1273short 2-32,768 到 32,7674ushort20 到 65,5355int4-2,147,483,648 到 2,147,483,6476uint40 到 4,294,967,2957float41.5 x 10−45 至 3.4 x 10388double85.0 10−324 到 1.…

springboot(ssm游戏交易系统 游戏出售平台 Java系统

springboot(ssm游戏交易系统 账号出售平台 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库…

位运算|比特位计数、汉明距离

位运算|比特位计数、汉明距离 338 比特位计数 /** 比特位计数法一&#xff1a;Brian Kernighan 算法的原理是&#xff1a;对于任意整数 x&#xff0c;令 xx & (x−1)&#xff0c;该运算将 x 的二进制表示的最后一个 1 变成 0。因此&#xff0c;对 x 重复该操作&#xff0…

极智开发 | 解读英伟达软件生态 深度神经网络库cuDNN

欢迎关注,获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 解读英伟达软件生态 深度神经网络库cuDNN。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq cuDNN,全称为 NVIDIA CUDA Deep Neural Net…

Transform环境搭建与代码调试——Attention Is All Y ou Need

1、源代码 2、环境搭建 conda create -n transform python3.8 -y conda activate transform cd /media/lhy/Transforms/annotatedtransformerpip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # # Uncomment for colabpip install -q torchdata…