总体思路:
利用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挂到对应的父节点中