Java中列表与树状对象的相互转换

一般用在菜单层级中,需要通过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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值