java---list变tree

111 阅读1分钟
  • 把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 {
    /**
     * 菜单id
     */
    private String menuId;
    /**
     * 菜单名称
     */
    private String menuName;
    /**
     * 父级菜单id
     */
    private String parentId;
    /**
     * 显示顺序
     */
    private String orderNum;
    /**
     * 菜单路由
     */
    private String url;
    /**
     * 菜单字体图标
     */
    private String icon;
    /**
     * 子菜单
     */
    private List<MenuBO> childMenus = new ArrayList<>();

}