package com.wlfy.www.menu;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author wl
* @description Menu 实体类
* @date 2022/4/6 20:09
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Menu {
/**
* id
*/
public Integer id;
/**
* 名称
*/
public String name;
/**
* 父id ,根节点为0
*/
public Integer parentId;
/**
* 子节点信息
*/
public List<Menu> childList;
public Menu(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
}
package com.wlfy.www.menu;
import com.alibaba.fastjson.JSON;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author wl
* @description MenuTest 获取菜单树类
* @date 2022/4/6 20:10
*/
public class MenuTest {
public static void main(String[] args) {
//模拟从数据库查询出来
List<Menu> menus = Arrays.asList(
new Menu(1, "根节点", 0),
new Menu(2, "子节点1", 1),
new Menu(3, "子节点1.1", 2),
new Menu(4, "子节点1.2", 2),
new Menu(5, "根节点1.3", 2),
new Menu(6, "根节点2", 1),
new Menu(7, "根节点2.1", 6),
new Menu(8, "根节点2.2", 6),
new Menu(9, "根节点2.2.1", 8),
new Menu(10, "根节点2.2.2", 8),
new Menu(11, "子节点3", 1),
new Menu(12, "子节点3.1", 11));
//获取父节点
List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
(m) -> {
m.setChildList(getChildrens(m, menus));
return m;
}
).collect(Collectors.toList());
System.out.println("-------转json输出结果-------");
System.out.println(JSON.toJSON(collect));
}
/**
* 递归查询子节点
*
* @param root 根节点
* @param all 所有节点
* @return 根节点信息
*/
private static List<Menu> getChildrens(Menu root, List<Menu> all) {
List<Menu> children = all.stream().filter(m -> Objects.equals(m.getParentId(), root.getId())).map(
(m) -> {
m.setChildList(getChildrens(m, all));
return m;
}
).collect(Collectors.toList());
return children;
}
}
结果
```java
[
{
"name": "根节点",
"childList": [
{
"name": "子节点1",
"childList": [
{
"name": "子节点1.1",
"childList": [],
"id": 3,
"parentId": 2
},
{
"name": "子节点1.2",
"childList": [],
"id": 4,
"parentId": 2
},
{
"name": "根节点1.3",
"childList": [],
"id": 5,
"parentId": 2
}
],
"id": 2,
"parentId": 1
},
{
"name": "根节点2",
"childList": [
{
"name": "根节点2.1",
"childList": [],
"id": 7,
"parentId": 6
},
{
"name": "根节点2.2",
"childList": [
{
"name": "根节点2.2.1",
"childList": [],
"id": 9,
"parentId": 8
},
{
"name": "根节点2.2.2",
"childList": [],
"id": 10,
"parentId": 8
}
],
"id": 8,
"parentId": 6
}
],
"id": 6,
"parentId": 1
},
{
"name": "子节点3",
"childList": [
{
"name": "子节点3.1",
"childList": [],
"id": 12,
"parentId": 11
}
],
"id": 11,
"parentId": 1
}
],
"id": 1,
"parentId": 0
}
]