作者:Lcry

blog.csdn.net/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;
}

格式化打印结果:

END

推荐好文

>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

Java8新特性:使用Stream流递归实现遍历树形结构相关推荐

  1. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

  2. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  3. Java8新特性-使用Stream流来实现递归遍历树形结构(案例)

    Java8新特性-Stream流 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来 ...

  4. Java8新特性之Stream流式编程

    特地感谢鲁班大叔的分享,原学习地址:Java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝 以下是学习过程整理的笔记 1.简介 Stream 流处理,首先要澄清的是 java8 中的 ...

  5. java8新特性之Stream流

    一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...

  6. Java8新特性之Stream流的使用

    Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作,在新版的JPA中,也已经加入了Stream. 1.Stream的操作步骤 Stream有如下三个操 ...

  7. JAVA8新特性之Stream流分组

    Apple apple01 = new Apple(1, "red", 100, "成都");Apple apple02 = new Apple(2, &quo ...

  8. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  9. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

最新文章

  1. Shell笔记9——Shell数组的应用实践
  2. 百度网盘文件分享演示,如何查看已经分享的文件
  3. arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程
  4. 牛客 - 云(扫描线)
  5. [渝粤教育] 西南科技大学 中学英语教材教法 在线考试复习资料
  6. 折半查找算法及分析(手工过程)
  7. 一汽奔腾b7o价位_全新第三代奔腾B70有何资格对合资品牌降维打击?
  8. Maven-pon.xml模板(ssm自用)持续更新
  9. 随想录(cloud 网络库)
  10. C# 语言规范_版本5.0 (第15章 委托)
  11. 如何写一个NB的商业计划书
  12. LeetCode_69(x 的平方根 )
  13. 在 WSO2 ESB 5.0.0 中使用 MyBatis 框架
  14. 基于单片机的智能视力保护监控系统设计
  15. ​ 最大尺寸的超宽高刷新率显示器 —— Legion Y44w 上手体验
  16. 【Books系列】2022年:《拼职场》读书笔记
  17. MyBatis学习第一步
  18. 1.1 迷茫的大学——《逆袭大学》连载
  19. 诺贝尔奖创纪录最高龄获奖者97岁
  20. 让生活不吃亏的技巧—《谈判》|每周一本书(7)

热门文章

  1. 华为Mate30系列诠释真旗舰:9月26日在国内正式发布
  2. 暴风集团冯鑫因涉嫌犯罪被采取强制措施 蓝港互动王峰:等他出来喝酒
  3. OPPO Reno巴萨定制版正式开售 10倍混合光变加持专属定制
  4. 成也炒作,败也炒作?孙宇晨遭遇最大信任危机
  5. 21.55万元起的“电影周边”!现代漫威联名钢铁侠车型开售
  6. 涨价妥妥的!一加7 Pro欧洲价格曝光:顶配或超6000
  7. 早买早享受 晚买有折扣 !特斯拉大降价致消费者拉横幅抗议
  8. 滴滴春节期间加强司机安全教育 考核通过才能上岗
  9. 拳王虚拟项目公社:利用减肥健身类虚拟资源项目,如何打造一套赚钱系统?
  10. 程序员离职后12天,被前领导命令回去讲清代码?小伙直接说收费