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