Java8 Stream流递归,几行代码搞定遍历树形结构

手撕Office二进制文件:CFB格式与元数据解析原理 复合二进制文件(CFB)是OLE文档的底层存储结构,广泛用于旧版Office文件(.doc/.ppt/.xls),其本质是一个嵌入式文件系统,包含Header、FAT表、Directory和Stream等核心组件。理解CFB原理,是实现零依赖、高可控性文档解析的基础,可绕过Interop调用带来的强耦合与资源开销问题。技术价值在于轻量级元数据提取——如DocumentSummaryInformation和SummaryInformation中存储的作者、标题、页数、创建时间等关键信息,支撑文档管理系统快速索 阅读详情

点击上方“Github爱好者社区”,选择星标

回复“资料”,获取小编整理的一份资料

来源:blog.youkuaiyun.com/qq_19244927/article/details/106481777

可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。

实体类:Menu.java

/**
 * Menu
 * @author lcry
 */
@Data
@Builder
public class Menu {
    /**
     * id
     */
    public Integer id;
    /**
     * 名称
     */
    public String name;
    /**
     * 父id ,根节点为0
     */
    public Integer parentId;
    /**
     * 子节点信息
     */
    public 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;
    }
    
}

递归组装树形结构:

@Test
    public void testtree(){
        //模拟从数据库查询出来
        List<Menu> menus = 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 = menus.stream().filter(m -> m.getParentId() == 0).map(
                (m) -> {
                    m.setChildList(getChildrens(m, menus));
                    return m;
                }
        ).collect(Collectors.toList());
        System.out.println("-------转json输出结果-------");
        System.out.println(JSON.toJSON(collect));
    }

    /**
     * 递归查询子节点
     * @param root  根节点
     * @param all   所有节点
     * @return 根节点信息
     */
    private 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;
    }

格式化打印结果:

3c1d3a5f6840987b3d378aaae922a740.png


好啦,今天的分享就到这儿啦,我们下次见啦~



GitHub原创推荐•  尼玛,Github上最邪恶的开源项目了!未满18或者女孩子勿进哦~•  GitHub标星4K+,前字节跳动工程师开源的刷题笔记...•  GitHub上这个仿京东电商项目强势开源,前端,后台,数据库等统统都有!•  GitHub 开发者自制火星车,教程全面开源!网友:这才是大佬!关注「Github爱好者社区」加星标,每天带你逛Github好玩的项目
java-根据过滤条件显示树形结构 java根据过滤条件显示树形结构,其中包括所需要的jar包 立即下载

相关推荐

Anthropic API接入指南:连接失败、403鉴权与Claude Code集成排查

在AI应用开发中,API接入与鉴权机制是开发者绕不开的基础工程问题。无论是调用云端模型服务还是自建网关,网络连通性、HTTP状态码语义、模型路由映射都会直接影响服务可用性。本文从通用的网络诊断与鉴权原理出发,梳理了从TCP连接失败到403权限拒绝的典型链路,并深入解析网关模型路由匹配机制。在此基础上,进一步说明如何通过环境变量完成Claude Code与VS Code的本地集成,以及一套基于Python的可复现接入方案。内容涵盖Anthropic API高频报错定位、curl冒烟测试、SDK工程化实践,适合

weixin_28743405的博客 468

Java8新特性-使用Stream流递归实现遍历树形结构

1.实体类: package entity; import lombok.Builder; import lombok.Data; import java.util.List; /** * 描述:Menu * * @author 何志鹏 * @ClassName:Menu * @create 2021-03-05 10:42 * Version 1.0 */ @Data @Builder public class Menu { /** * id */.

weixin_39643007的博客 3194

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

【JAVA】查询树形结构的数据

查询树形结构的数据

小朋友的博客 1593

强化学习赋能宇树机器狗:Isaac Gym与MuJoCo仿真训练全解析

本文详细解析了如何利用Isaac Gym和MuJoCo两大仿真平台为宇树机器狗构建强化学习训练管道。内容涵盖环境配置、模型导入、PPO算法框架设计、奖励函数构建以及从仿真到实机的策略迁移技巧,为开发者提供了一套完整的宇树狗仿真训练实践方案。

zeta9的博客 620

RT-DETR升级:TGRS2026 CKConv结合RepC3 | 方向特征与跨阶段融合协同,小目标漏检率大幅下降

小目标鲁棒性提升:CKConv方向选择性抑制背景噪声,RepC3跨阶段传递保留深层微弱热信号,显著改善低对比度、低信噪比场景下的检测精度。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 151

java递归查询子节点

java递归查询子节点

Myselfh的博客 3470

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 155

java8 集合构造树结构

【代码】java8 集合构造树结构。

癸酉金鸡的博客 560

《open3D+pyqt》点云读取、显示与保存

《open3D+pyqt》第一章:点云读取与显示一、效果展示二、环境配置三、代码3.1 qt designer设置3.2 生成ui,qrc的py文件3.3 py文件代码 一、效果展示 二、环境配置 环境配置:Anconda+pycharm+pyqt+open3d+pyqtgraph 显示界面:这里选择pyqtgraph 参考网上教程 三、代码 3.1 qt designer设置 界面布局参照《PCL+QT》教程,界面设置:布局如下: 布局参数参考: 3.2 生成ui,qrc的py文件 3.3 py

阁楼 7113

论文阅读 AIED 2024 Coding with AI: How Are Tools Like ChatGPT Being Used by Students in Foundational Pro

该论文题为《Coding with AI: How Are Tools Like ChatGPT Being Used by Students in Foundational Programming Courses》,由美国犹他州立大学的 Aashish Ghimire 与 John Edwards 共同撰写,发表于人工智能与教育领域顶级会议。

CSPhD-winston的博客 307

treeNode 树形结构 及数据表设计 Java遍历树形结构

https://segmentfault.com/q/1010000000126370

zhaoyang10的专栏 1213

java零基础从入门到精通(全)

目录前言1. 入门知识1.1 java体系1.2 JDK/JRE/JVM区别1.3 编译与运行理解1.4 类体函数细节2. 标识符 前言 java优势 健壮性(JVM(C++语言写的一个虚拟的计算机)、GC(垃圾回收机制)) 多线程并发 可移植性/跨平台 1. 入门知识 1.1 java体系 JavaSE:标准版 JavaEE:企业版 JavaME:微型版 1.2 JDK/JRE/JVM区别 JVM是不能独立安装的。 JRE和JDK都是可以独立安装的 层层嵌套,jvm包括jdk,jdk包括jre

码农研究僧的博客 6万+

java链接文章收集汇总

自己收集的一些好的java链接

weixin_44681259的博客 420

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据亲和力:编程语言与二进制/文本/结构化数据的匹配本质

数据亲和力指编程语言对原始数据格式(如二进制字节流、纯文本流、XML/JSON等结构化文本)的天然适配能力。其核心在于语言的数据模型是否贴近物理表示、类型系统是否支持安全的底层操作、标准库是否将常见数据格式视为一等公民。例如,C语言通过指针与内存布局直连二进制,Shell以文本流为唯一契约实现管道组合,Perl将正则内建为语法原语,Groovy用方法调用动态生成XML。这种亲和力直接决定解析效率、协议变更成本与新人上手难度——它不是语法糖多寡的表层差异,而是影响每日开发质量的底层工程事实。

dejz8829的专栏 527

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

掌阅客户端岗秋招笔试复盘:从算法到工程化的备考指南

客户端开发是移动互联网的核心方向,其技术体系涵盖算法、网络、操作系统与UI渲染等多个维度。校招笔试作为人才筛选的第一关,往往通过带业务场景的题目考察候选人的工程判断力。例如,处理乱序文本、模拟书架增量更新,既检验数据结构基础,又反映对数据流的理解。网络层面,HTTPS握手依赖根证书库与安全模块,内存管理、线程池与事件循环则是操作系统部分的重点。以掌阅科技客户端岗秋招笔试为例,拆解题型与复盘思路,涵盖从LeetCode中等题到下载器设计、翻页卡顿排查等实战内容,为准备移动端校招的开发者提供系统化备考参考。

weixin_33910137的博客 457

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java【lambda表达式】语法及使用方式介绍

由于正在更新 Java【EE初阶】部分中多线程相关的文章,lambda表达式 是多线程编程中很常用的语法功能,本篇将分享 lambda表达式 相关的内容, 主要介绍 lambda表达式 的使用方式 以及在集合中的一些应用如果看到这篇文章的读者们正处于 Java 基础语法阶段,只要有【类和对象、接口】部分的基础就可以无压力学会 lambda表达式 的基本操作提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎评论区指点~ 废话不多说,直接发车~函数式接口。

yzhcjl_的博客 3596

【Java 进阶篇】使用 Stream 流和 Lambda 组装复杂父子树形结构(List 集合形式)

在最近的开发中,一星期内遇到了两个类似的需求:返回组装好的部门树、返回组装好的地区信息树,最终都需要返回 List 集合对象给前端。于是在经过需求分析和探索实践后,我对于这种基于 Stream 和 List 结构的父、子树形结构的操作有了新的认识,现在拿出来和大家作分享交流。一般来说完成这样的需求大多数人会想到递归,但递归的方式弊端过于明显:方法多次自调用效率很低、数据量大容易导致堆栈溢出、随着树深度的增加其时间复杂度会呈指数级增加等。一次数据库查询全部数据(几万条),其它全是内存操作、性能高;

sinat_53467514的博客 1977

java树形结构

最近打算做一个bbs作为数据库的课程设计,并且打算

u012942345的专栏 484

java递归遍历目录树(上下层级关系)

@EntityScan @Data @Builder public class DepartmentList { private Integer id; private String name; private java.util.List<DepartmentList> child; } /** * @author gmy * @version 1.0 * @date 2021/7/23 15:15 */ @Service @AllArgsCons...

小高同学要努力吖 2636
上一篇: 32岁清华女教授获奖百万走红后回应:人生第一次因颜值受到关注
下一篇: 武大94年博士年薪201万入职华为!学霸日程表曝光,简直降维打击!
公众号:【GitHub爱好者社区】
博客等级 码龄6年 353粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值