一般用在菜单层级中,需要通过Java对前端传入的参数或数据库中查询到的参数进行转换处理。
1. 将树状转为列表
- 转换前的树状实例对象
@Data
public class Menu {
private String menuName;
private List<Menu> children;
}
- 转换后的列表实例对象
@Data
public class MenuConfig{
private String menuCode; //菜单编码
private String menuName; //菜单名称
private Integer menuLevel; //菜单层级
private String menuParentCode; //父级菜单编码
}
- 转换方法
调用getMenuList方法时,menuLevel为置为1,menuParentCode为null
//第一此调用时 层级为1 父级菜单code为null
public List<MenuConfig> getMenuList(Integer menuLevel,
String menuParentCode,
List<Menu> menuList) {
List<MenuConfig> menus = new ArrayList<>();
for (Menu menu : menuList) {
MenuConfig menuConfig = new MenuConfig();
menuConfig .setMenuName(menu.getMenuName());
menuConfig .setMenuLevel(menuLevel);
String menuCode = IdUtil.fastSimpleUUID();
menuConfig .setMenuCode(menuCode);
menuConfig .setMenuParentCode(menuParentCode);
if (!CollectionUtils.isEmpty(menu.getChildren())) {
List<MenuConfig> menuChildren = getMenuList(menuLevel + 1, menuCode,
menu.getChildren());
menus.addAll(menuChildren);
}
menus.add(menuConfig );
}
return menus;
}
2. 将列表转为树状
- 转换前后的对象
@Data
public class MenuConfigResp {
/**
* 菜单名称
*/
private String menuName;
/**
* 菜单code
*/
private String menuCode;
/**
* 父级菜单code
*/
private String menuParentCode;
/**
* 层级
*/
private Integer menuLevel;
private List<MenuConfigResp> children;
}
- 转换方法
public List<MenuConfigResp> recursiveTree(List<MenuConfigResp> menus) {
List<MenuConfigResp> root = new ArrayList<>();
Map<String, MenuConfigResp> menusMap = menus.stream().collect(Collectors.toMap(MenuConfigResp::getMenuCode, menu -> menu));
for (MenuConfigResp menu : menus) {
String parentCode = menu.getMenuParentCode();
if (StrUtil.isEmpty(parentCode)) {
root.add(menu);
continue;
}
MenuConfigResp menuConfigRespBO = menusMap.get(parentCode);
if (Objects.isNull(menuConfigRespBO.getChildren())) {
menuConfigRespBO.setChildren(new ArrayList<>());
}
menuConfigRespBO.getChildren().add(menu);
}
return root;
}
此方法中,入参的MenuConfigResp的children为null。