TreeSelect 类字段
private Long id;

private String label;

private List<TreeSelect> children;

核心思想:不要把查到的list放进去进行递归,因为会导致for循环中的代码执行笛卡尔积次数,就算仅仅是list.stream.filter操作,2000W次也是需要耗费大量时间
所以把list转成map,遍历时候直接通过map的get方法获取字节点,效率快很多倍
  Map<Long,SysDeptVO> deptMap = new HashMap<>();
  Map<String,List<SysDeptVO>> chilerenDeptMap = new HashMap<>();
  list.forEach(x->{
    if(!deptMap.containsKey(x.getDeptId())){
    deptMap.put(x.getDeptId(),x);
  }
  if(!chilerenDeptMap.containsKey(x.getParentId())){
  List<SysDeptVO> sysDepts = new ArrayList<>();
    sysDepts.add(x);
    chilerenDeptMap.put(x.getParentId(),sysDepts);
  }else{
    chilerenDeptMap.get(x.getParentId()).add(x);
  }
  });

TreeSelect select = new TreeSelect();
select.setId(sysDept.getDeptId());
select.setLabel(sysDept.getDeptName());
select.setChildren(getChildren(sysDept.getDeptId(),deptMap,chilerenDeptMap));
sysDepts.add(select);

List<TreeSelect> getChildren(Long id,Map<Long,SysDeptVO> deptMap,Map<String,List<SysDeptVO>> chilerenDeptMap){
  List<SysDeptVO> sysDepts =chilerenDeptMap.get(id.toString());
  if(CollectionUtils.isEmpty(sysDepts)){
    return null;
  }
  List<TreeSelect> treeSelects = new ArrayList<>();
  for(SysDeptVO dept : sysDepts){
    TreeSelect select = new TreeSelect();
    select.setId(dept.getDeptId());
    select.setLabel(dept.getDeptName());
    select.setChildren(getChildren(dept.getDeptId(),deptMap,chilerenDeptMap));
    treeSelects.add(select);
  }
  return treeSelects;
}