java8用新特性stream做递归处理

在平时的业务中,避免不了使用递归,比如菜单列表,区域列表等,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理。

下来用代码做个测试

1.先定义一个实体类:

@Data
public class Area {/*** id*/public Integer id;/*** 名称*/public String areaName;/*** 父id,根节点为0*/public Integer parentId;/*** 子节点信息*/public List<Area> childList;public Area(Integer id, String areaName, Integer parentId) {this.id = id;this.areaName = areaName;this.parentId = parentId;}public Area(Integer id, String areaName, Integer parentId, List<Area> childList) {this.id = id;this.areaName = areaName;this.parentId = parentId;this.childList = childList;}
}

2.递归组装树形结构:

public class TestTree {//模拟从数据库查询出来List<Area> areas = Arrays.asList(new Area(1,"根节点",0),new Area(2,"陕西省",1),new Area(3,"西安市",2),new Area(4,"延安市",2),new Area(5,"雁塔区",3),new Area(6,"四川省",1),new Area(7,"成都市",6),new Area(8,"青牛区",7),new Area(9,"绵阳市",6));//获取父节点List<Area> collect = areas.stream().filter(m -> m.getParentId() == 0).map((m) -> {m.setChildList(getChildrens(m, areas));return m;}).collect(Collectors.toList());/*** 递归查询子节点* @param root  根节点* @param areaList  所有节点* @return 根节点信息*/private List<Area> getChildrens(Area root, List<Area> areaList) {return areaList.stream().filter(m -> {return Objects.equals(m.getParentId(), root.getId());}).map((m) -> {m.setChildList(getChildrens(m, areaList));return m;}).collect(Collectors.toList());}@org.junit.Testpublic void test(){System.out.println("-------转json输出结果-------");System.out.println(JSON.toJSON(collect));}}

3.展示不全,打印部分结果

 大家可以进来一起探讨问题。

 

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

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

相关文章

2024年【G2电站锅炉司炉】考试报名及G2电站锅炉司炉复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉考试报名是安全生产模拟考试一点通生成的&#xff0c;G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2024年【G2电站锅炉司炉】考试报名及G2电站锅炉…

LeetCode 144. 94. 145. 二叉树的前序,中序,后续遍历(详解) ੭ ᐕ)੭*⁾⁾

目录 144.二叉树的前序遍历 一. TreeSize函数的实现&#xff1a; 二. preOrderTree函数的实现&#xff1a; 三.preorderTraversal函数的实现&#xff1a; 最后完整代码&#xff1a; 94.二叉树的中序遍历&#xff1a; 145.二叉树的后续遍历&#xff1a; 经过前面的二叉树的学习&…

Spring第七天(AOP)

简介 AOP(Aspect Oriented Programing)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 作用 在不惊动原始设计的基础上为其进行功能增强 Spring理念&#xff1a;无入侵式/无侵入式 基本概念 连接点(JoinPoint) : 程序执行过程中的任意位置&a…

如何使用 OpenCV 扫描图像、查找表和时间测量

目标 我们将寻求以下问题的答案&#xff1a; 如何浏览图像的每个像素&#xff1f;OpenCV 矩阵值是如何存储的&#xff1f;如何衡量我们算法的性能&#xff1f;什么是查找表&#xff0c;为什么要使用它们&#xff1f; 我们的测试用例 让我们考虑一种简单的颜色减少方法。通过…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

Go 知识slice

Go 知识slice 1. 什么是slice2. slice 基础2.1 定义 2.2 实现原理2.2.1 make 创建2.2.2 切片 创建 2.3 操作2.3.1 append 追加2.3.2 表达式切片2.3.3 扩展表达式2.3.4 扩容2.3.5 拷贝 3. 测试一下3.1 len && cap3.2 append && 扩容3.3 切片表达式 1. 什么是sli…

Spring第六天(注解开发第三方Bean)

注解开发管理第三方Bean 显然&#xff0c;我们无法在第三方Bean中写入诸如service这样的注解&#xff0c;所以&#xff0c;Spring为我们提供了Bean这一注解来让我们通过注解管理第三方Bean 第二种导入方式由于可读性太低&#xff0c;故只介绍第一种导入方式&#xff0c;这里我…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

内网安全管理系统(保密管理系统)

在当今信息化的时代&#xff0c;企业的内网已经成为其核心资产的重要组成部分。 随着企业的快速发展和信息化程度的提升&#xff0c;内网安全问题日益凸显&#xff0c;如何保障内网的安全和机密信息的保密性&#xff0c;已经成为企业亟待解决的问题。 内网安全管理系统(保密管…

第11章 GUI Page507 步骤三十五:处理应用退出事件

为wxFrame&#xff0c;生成一个EVT_CLOSE事件响应函数&#xff1a; 实现如下&#xff1a; 运行效果&#xff1a;关闭时&#xff0c;会弹出对话框询问是否保存

(蓝桥杯每日一题)love

问题描述 马上就要到七夕情人节了&#xff0c;小蓝在这天想要心爱得男神表白&#xff0c;于是她写下了一个长度为n仅由小写字母组成的字符串。 她想要使这个字符串有 1314个 love 子序列但是马虎的小蓝却忘记了当前已经有多少个子序列为 love。 请你帮小蓝计算出当前字符串有多…

初识MQ-同步异步

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、同步通讯二、异步通讯2.1.异步调用方案2.2.异步的优缺点 三、什么时MQ3.1 mq和broker3.2几种mq的优缺点对比 总结 前言 一、同步通讯 同步调用问题&#…