第一种
public ApiResult getXGrBasZonationScheme(String projectId) {
QueryWrapper<XGrBasZonationScheme> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("activity_id", projectId);
List<XGrBasZonationScheme> list = xGrBasZonationSchemeMapper.selectList(queryWrapper);
List<XGrBasZonationScheme> resultList = new ArrayList<>();
for (XGrBasZonationScheme result : list) {
if (ObjectUtils.isEmpty(result.getParentZoneId())) {
//调用方法给子类添加数据
resultList.add(getMenuTree(result, list));
}
}
return ApiResult.ofSuccessResult(resultList);
}
private XGrBasZonationScheme getMenuTree(XGrBasZonationScheme result, List<XGrBasZonationScheme> list) {
for (XGrBasZonationScheme xGrBasZonationScheme : list) {
//如果父类主键等于传过来实体类的ID
if (result.getZoneId().equals(xGrBasZonationScheme.getParentZoneId())) {
if (result.getChildren() == null) {
result.setChildren(new ArrayList<>());
}
// 递归调用
result.getChildren().add(getMenuTree(xGrBasZonationScheme, list));
}
}
return result;
}
第二种,更好用
/**
* @param parentMenu获取所有顶级菜单
*/
for (Menu menu : parentMenu) {
this.setChildren(menu, menus);
}
sorted(parentMenu);
/**
* 从所有节点列表中查找并设置parent的所有子节点
*
* @param parent 父节点
* @param nodes 所有树节点列表
*/
private void setChildren(Menu parent, List<Menu> nodes) {
List<Menu> children = Lists.newArrayList();
Object parentId = parent.getId();
for (Iterator<Menu> iterator = nodes.iterator(); iterator.hasNext(); ) {
Menu node = iterator.next();
if (Objects.equals(node.getParentCode(), parentId)) {
children.add(node);
//从所有节点列表中删除该节点,以免后续重复遍历该节点
iterator.remove();
}
}
//如果孩子为空,则直接返回,否则继续遍历递归设置孩子的孩子
if (children.isEmpty()) {
return;
}
parent.setChildren(children);
children.forEach(e -> setChildren(e, nodes));
}
/**
* 给树结构排序
*
* @param parentMenu所有树节点列表
*/
private void sorted(List<Menu> parentMenu) {
for (Menu menu : parentMenu) {
if (CollectionUtils.isNotEmpty(menu.getChildren())) {
List<Menu> collect = menu.getChildren().stream()
.sorted(Comparator.comparing(Menu::getShoworder)
.thenComparing(Menu::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
sorted(collect);
menu.setChildren(collect);
}
}
}