Java怎么做树型数据

数据库里面的数据是这样子的

img


想要做成的数据结构是这样子的

img


没有思路


package com.learning.tool.递归;


import cn.hutool.json.JSONUtil;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SysMenuList {


    public List<SysMenu> getCurrentUserNav(List<SysMenu> menus) {


        //转树状结构
        List<SysMenu> menuTree = buildThreeMenu(menus);

        System.out.println("JSONUtil.toJsonStr(menuTree) = " + JSONUtil.toJsonStr(menuTree));


        //递归
        System.out.println("JSONUtil.toJsonStr(recursive(menuTree)) = " + JSONUtil.toJsonStr(recursive(menuTree)));

        return recursive(menuTree);
    }

    List<SysMenu> recursive(List<SysMenu> menuTree) {

        menuTree.forEach(menu -> {
            //判断是否含有子集
            if (menu.getChildren() != null && menu.getChildren().size() > 0) {
                menu.setChildren(recursive(menu.getChildren()));
            }
        });

        return menuTree;
    }

    private List<SysMenu> buildThreeMenu(List<SysMenu> menus) {
        List<SysMenu> finalMenus = new ArrayList<>();

        //各自寻找到各自的孩子
        for (SysMenu menu : menus) {
            for (SysMenu e : menus) {
                //判断当前菜单的id是否是父级id
                if (menu.getId().equals(e.getParentId())) {
                    finalMenus.add(e);
                    menu.setChildren(finalMenus);
                }
            }

            //提取父节点 当中上方for循环中add进去的子节点的数据
            if (menu.getParentId() == 0L) {
                finalMenus.add(menu);
            }
        }


        return finalMenus;

    }

    @Test
    public void a() {
        List<SysMenu> list = new ArrayList<>();
        list.add(SysMenu.builder().id(1L).parentId(0L).name("系统管理").build());
        list.add(SysMenu.builder().id(2L).parentId(1L).name("用户管理").build());
        list.add(SysMenu.builder().id(3L).parentId(1L).name("角色管理").build());

        getCurrentUserNav(list);
    }


}

class Object{ 
          list <Object> children
}