- 把list根据父子关系,组合成tree级结构,packageMenus是核心代码
package com.my.demo.Utils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
public class PackageMenus {
@Test
public void test() {
List<MenuBO> menuBOS = JSON.parseArray(mockData(), MenuBO.class);
Map<String, MenuBO> menuMap = menuBOS.stream().collect(Collectors.toMap(MenuBO::getMenuId, Function.identity()));
List<MenuBO> menuTree = packageMenus(menuMap);
log.info("menuTree:{}", JSON.toJSONString(menuTree));
}
public List<MenuBO> packageMenus(Map<String, MenuBO> menuMap) {
List<MenuBO> menuTree = new ArrayList<>();
menuMap.forEach((menuId, menu) -> {
if(!menuMap.containsKey(menu.getParentId())){
menuTree.add(menu);
}else{
MenuBO parent = menuMap.get(menu.getParentId());
parent.getChildMenus().add(menu);
parent.getChildMenus().sort(Comparator.comparing(MenuBO::getOrderNum));
}
});
menuTree.sort(Comparator.comparing(MenuBO::getOrderNum));
return menuTree;
}
public String mockData() {
return "[\n" +
" {\n" +
" "menuId": "1",\n" +
" "menuName": "用户管理",\n" +
" "parentId": "0",\n" +
" "orderNum": "1",\n" +
" "url": "/user",\n" +
" "icon": "user"\n" +
" },\n" +
" {\n" +
" "menuId": "2",\n" +
" "menuName": "文件管理",\n" +
" "parentId": "0",\n" +
" "orderNum": "1",\n" +
" "url": "/file",\n" +
" "icon": "file"\n" +
" },\n" +
" {\n" +
" "menuId": "1-1",\n" +
" "menuName": "用户管理",\n" +
" "parentId": "1",\n" +
" "orderNum": "1",\n" +
" "url": "/user/add",\n" +
" "icon": "userAdd"\n" +
" },\n" +
" {\n" +
" "menuId": "1-2",\n" +
" "menuName": "角色管理",\n" +
" "parentId": "1",\n" +
" "orderNum": "2",\n" +
" "url": "/role/add",\n" +
" "icon": "roleAdd"\n" +
" },\n" +
" {\n" +
" "menuId": "2-1",\n" +
" "menuName": "上传文件",\n" +
" "parentId": "2",\n" +
" "orderNum": "1",\n" +
" "url": "/file/upload",\n" +
" "icon": "fileUpload"\n" +
" },\n" +
" {\n" +
" "menuId": "2-2",\n" +
" "menuName": "删除文件",\n" +
" "parentId": "2",\n" +
" "orderNum": "2",\n" +
" "url": "/file/delete",\n" +
" "icon": "fileDel"\n" +
" },\n" +
" {\n" +
" "menuId": "2-2-1",\n" +
" "menuName": "删除文件-1",\n" +
" "parentId": "2-2",\n" +
" "orderNum": "1",\n" +
" "url": "/file/delete/1",\n" +
" "icon": "fileDel"\n" +
" }\n" +
"]";
}
package com.my.demo.Utils;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
class MenuBO {
private String menuId;
private String menuName;
private String parentId;
private String orderNum;
private String url;
private String icon;
private List<MenuBO> childMenus = new ArrayList<>();
}