[
{
"children":Array[2],
"id":1,
"name":"广东",
"pid":0
},
{
"children":[
{
"children":[
{
"children":Array[0],
"id":6,
"name":"高新开发区",
"pid":5
}
],
"id":5,
"name":"南昌",
"pid":2
}
],
"id":2,
"name":"江西",
"pid":0
}
]
一刚从事编程不久的同学,咨询怎么查询返回父子菜单。因不确认最终有多少层级,故使用递归即可。说干就干,直接贴代码。
package com.xuyw.test;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test2 {
public static void main(String[] args) {
//mock 数据库查询
List<Menu> menuList = getData();
Map<Long, List<Menu>> menuMap = menuList.stream().collect(Collectors.groupingBy(Menu::getPid));
//获取顶级菜单
List<Menu> firStMenu = menuMap.get(0L);
List<Menu> res = new ArrayList<>();
for (Menu m : firStMenu) {
List<Menu> children = menuMap.get(m.getId());
if (children == null || children.size() == 0) {
continue;
}
res.add(recursiveTree(m,menuMap));
}
System.out.println(JSON.toJSONString(res));
}
public static Menu recursiveTree(Menu node, Map<Long, List<Menu>> menuMap) {
List<Menu> childTreeNodes = menuMap.get(node.getId());
if(childTreeNodes==null){
return node;
}
for (Menu child : childTreeNodes) {
Menu n = recursiveTree(child, menuMap);
node.getChildren().add(n);
}
return node;
}
public static List<Menu> getData() {
List<Menu> data = new ArrayList<>();
Menu menu = new Menu();
menu.setId(1L);
menu.setName("广东");
menu.setPid(0L);
data.add(menu);
menu = new Menu();
menu.setId(2L);
menu.setName("江西");
menu.setPid(0L);
data.add(menu);
menu = new Menu();
menu.setId(3L);
menu.setName("廣州");
menu.setPid(1L);
data.add(menu);
menu = new Menu();
menu.setId(4L);
menu.setName("深圳");
menu.setPid(1L);
data.add(menu);
menu = new Menu();
menu.setId(5L);
menu.setName("南昌");
menu.setPid(2L);
data.add(menu);
menu = new Menu();
menu.setId(6L);
menu.setName("高新开发区");
menu.setPid(5L);
data.add(menu);
return data;
}
@Data
public static class Menu {
private Long id;
private String name;
private Long pid;
private List<Menu> children = new ArrayList<>();
}
}