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