java List转树形List

977 阅读1分钟

在开发过程中,有时候前端会使用树展示数据,为了减少前端好基友的工作量,直接由后端将list集合转成树状list。

先看一眼数据: image.png

在实体类中添加子节点集合字段:

   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;
}


前端获取到数据如下: image.png