通过双层循环
public List<PortalSysDic> getParentList(){
List<PortalSysDic> list = portalSysDicDao.getDicListByParentId("0");
if (CollectionUtil.isNotEmpty(list)){
getChildren(list);
}
return list;
return getParentList_v2();
}
public void getChildren(List<PortalSysDic> list){
if (CollectionUtil.isNotEmpty(list)){
for (PortalSysDic portalSysDic : list) {
List<PortalSysDic> childrenlist = portalSysDicDao.getDicListByParentId(portalSysDic.getId());
if (CollectionUtil.isNotEmpty(childrenlist)){
portalSysDic.setChildrenList(childrenlist);
getChildren(childrenlist);
}
}
}
}
通过 stream 进行分组递归
// stream 流递归
public List<PortalSysDic> getParentList_v2(){
List<PortalSysDic> list = portalSysDicDao.getDicListByParentId(null);
if (CollectionUtil.isNotEmpty(list)){
// 根据 parentId 进行分组,key则为parentId
Map<String, List<PortalSysDic>> collect = list.stream().filter(e->!e.getParentId().equals("0"))
.collect(Collectors.groupingBy(PortalSysDic::getParentId));
list.forEach(node->{
// 循环原始数据根据id找出上一步分组的数据并set子集
node.setChildrenList(collect.get(node.getId()));
});
// 最后将父级过滤出来
list = list.stream().filter(e -> e.getParentId().equals("0")).collect(Collectors.toList());
}
return list;
}