在开发过程中,有时候前端会使用树展示数据,为了减少前端好基友的工作量,直接由后端将list集合转成树状list。
先看一眼数据:
在实体类中添加子节点集合字段:
public class BusCategroyItem{
private Integer id;
private String code;
private String name;
private Integer parentid;
.
.
.
private List<BusCategroyItem> children; // 子节点集合
}
接下来构建树形list集合:
/**
* List转Tree
* @param items
* @param flag 是否查找下层子节点 true:加载完整树
*/
public List<BusCategoryItem> buildBusCategoryTree(List<BusCategoryItem> items, boolean flag){
if(Collections.isEmpty(items)){
return null;
}
List<BusCategroyItem> busCategroyTree = new ArrayList<>(); // 要构建的树
List<Integer> idList = new ArrayList<>(); // 存所有数据项的id,用来查找根节点
Iterator<BusCategroyItem> iterator = items.iterator();
while(iterator.hasNext()){
BusCategroyItem item = iterator.next();
idList.add(item.getId());
}
iterator = items.iterator();
while(iterator.hasNext()){
BusCategroyItem item = iterator.next();
if(!idList.contains(item.getParentid())){ // 判断当前节点是否为根节点
this.recursionFn(items, item, flag);
busCategroyTree.add(item);
}
}
return busCategroyTree;
}
/**
* 递归构建树
* @param items
* @param item
*/
private void recursionFn(List<BusCategroyItem> items, BusCategroyItem item, boolean flag) {
List<BusCategroyItem> childList = this.getChildList(items, item); // 获取当前节点的所有子节点
item.setChildren(childList);
if(flag){
Iterator<BusCategroyItem> iterator = childList.iterator();
if(iterator.hasNext()){
BusCategroyItem childItem = iterator.next();
// 判断子节点还有无子节点
if(this.hasChildren(items,childItem)){
this.recursionFn(items, childItem);
}
}
}
}
/**
* 获取当前节点的所有子节点
* @param items
* @param item
* @return
*/
private List<BusCategroyItem> getChildList(List<BusCategroyItem> items, BusCategroyItem item) {
return items.stream().filter(t -> Objects.equals(item.getId(), t.getParentid())).collect(Collectors.toList());
}
/**
* 判断当前节点有无子节点
* @param items
* @param childItem
* @return
*/
private boolean hasChildren(List<BusCategroyItem> items, BusCategroyItem childItem) {
return this.getChildList(items,childItem).size()>0;
}
前端获取到数据如下: