使用Stream流递归实现遍历树形结构

image 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。 比如现在有一张菜单表,具体数据如下: image 下面我们就来模拟这一操作,递归组装树形结构: @Autowired JdbcTemplate jdbcTemplate;

1@Test 2void buildMenuTree() { 3 String sql = "select menu_id,menu_name,parent_id from sys_menu"; 4 List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); 5 List<Menu> menus = new ArrayList<>(); 6 if (CollUtil.isNotEmpty(maps)) { 7 for (Map<String, Object> map : maps) { 8 Menu menu = new Menu(); 9 menu.setId((Integer) map.get("menu_id")); 10 menu.setName((String) map.get("menu_name")); 11 menu.setParentId((Integer) map.get("parent_id")); 12 menus.add(menu); 13 } 14 } 15 //获取父节点 16 List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map( 17 (m) -> { 18 m.setChildList(getChildrens(m, menus)); 19 return m; 20 } 21 ).collect(Collectors.toList()); 22 System.out.println("-------转json输出结果-------"); 23 System.out.println((JSONUtil.toJsonStr(collect))); 24} 25 26/** 27 * 递归查询子节点 28 * 29 * @param root 根节点 30 * @param all 所有节点 31 * @return 根节点信息 32 */ 33private List<Menu> getChildrens(Menu root, List<Menu> all) { 34 List<Menu> children = all.stream().filter(m -> { 35 return Objects.equals(m.getParentId(), root.getId()); 36 }).map( 37 (m) -> { 38 m.setChildList(getChildrens(m, all)); 39 return m; 40 } 41 ).collect(Collectors.toList()); 42 return children; 43}

输出结果如下:

image

文章来源:blog.csdn.net/qq_19244927/article/details/106481777

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

实际开发过程中遇到的js方法

1.递归方法实现树形结构formatCompanyTree(data,id){constnewDatadata.filter(itemitem.pidid).map(item({...item,disabled:item.nodetype

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )