Java8从构建树形结构

总体思路:

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

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

代码如下

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

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

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

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(

手写Java HashMap源码

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

js 数组 转为树形结构

需要转换为树形的数组vardata{"orderById":null,"platformCommissionProportion":1,"name":"添加剂","pid":13,"id":26

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

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

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前