Java8从构建树形结构

Wesley13
• 阅读 953

总体思路:

    利用Java8的新特性Lambda和流的map、collect,不断的递归调用得到树形结构

另:如果想得到无限层的话,把level的限制放开,构造并返回自定义的数据结构就可以了

代码如下

    public ItemCatResult queryItemCatsNew() {
        //声明一个存储的对象,然后构建对象
        ItemCatResult result=new ItemCatResult();
        List<ItemCat> cats=itemCatMapper.selectAll();
        //对从数据库返回的列表进行分组,返回的结果为Map<Long,List<ItemCat>>
        Map<Long,List<ItemCat>> maps = cats.stream().collect(Collectors.groupingBy(ItemCat::getParentId));
        //调用构建树形结构的方法,递归调用
        List<?> l =  createTree(0L,maps,1);
        
        result.setItemCatList(l);
        return result;
    }
    List<?> createTree(Long parentId,Map<Long,List<ItemCat>> maps,int level){
        //因为需求只需要取到三层,所以传入level
        if(level <= 3) {
            List<?> l = maps.get(parentId).stream().map(x->{
                //每一层构建的NODE不一样
                if(level == 1) {
                    return new ItemCatData("/products/"+x.getId()+"/.html","<a href='/products/"+x.getId()+".html'>"+x.getName()+"</a>",createTree(x.getId(),maps,level+1));
                }else if(level == 2){
                    return new ItemCatData("/products/"+x.getId()+"/.html",x.getName(),createTree(x.getId(),maps,level+1));
                }else {//虽然是else,因为level前面限制了<=3,所以执行到这里的时候必然是level=3,其返回结果不再是NODE而是一个String
                    return "/produts/"+x.getId()+".html|"+x.getName();
                }
            }).collect(Collectors.toList());
            return l;
        }else {
            return null;
        }
    }

补充:如果不适用Java8,还可以按照如下步骤构建

1.遍历List,构建一个Map<Long,List>

2.再取得第一步的Value对应的迭代器

3.遍历迭代器,将每个Node挂到对应的父节点中

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
翼
3年前
js 数组 转为树形结构
需要转换为树形的数组vardata{"orderById":null,"platformCommissionProportion":1,"name":"添加剂","pid":13,"id":26
郜小超 郜小超
3年前
实际开发过程中遇到的js方法
1.递归方法实现树形结构formatCompanyTree(data,id){constnewDatadata.filter(itemitem.pidid).map(item({...item,disabled:item.nodetype
xxkfz xxkfz
2年前
使用Stream流递归实现遍历树形结构
可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。比如现在有一张菜单表,具体数据如下:下面我们就来模拟这一操作,递归组装树形结构:@Autowi
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这