文章目录
- 1、前言
- 2、预处理数据
- 3、期望得到数据结构
- 5、示列代码
1、前言
- 如我们常见的数据库的菜单, 省市区, 权限通过父ID进行关联, 处理成树状数据返回至前端
- 代码地址: https://gitee.com/xmaxm/test-code/tree/master/chaim-special-data/src/main/java/com/chaim/special/data/menu
2、预处理数据
menuParentId关联父ID
[
MenuBO(id=1547414817916182529, menuParentId=0, name=商品管理, level=1, type=1),
MenuBO(id=1547414920685019137, menuParentId=0, name=订单管理, level=1, type=1),
MenuBO(id=1547414986762084353, menuParentId=1547414817916182529, name=商品列表, level=2, type=1),
MenuBO(id=1547415070325202945, menuParentId=1547414817916182529, name=商品分组, level=2, type=1),
MenuBO(id=1547415128978350082, menuParentId=1547414986762084353, name=添加, level=3, type=2),
MenuBO(id=1547415281852342273, menuParentId=1547414986762084353, name=删除, level=3, type=2)
]
3、期望得到数据结构
转换为树数据结构
[{
"id": 1547414817916182529,
"name": "商品管理",
"menuVOList": [{
"id": 1547414986762084353,
"name": "商品列表",
"menuVOList": [{
"id": 1547415128978350082,
"name": "添加",
"menuVOList": []
}, {
"id": 1547415281852342273,
"name": "删除",
"menuVOList": []
}]
}, {
"id": 1547415070325202945,
"name": "商品分组",
"menuVOList": []
}]
}, {
"id": 1547414920685019137,
"name": "订单管理",
"menuVOList": []
}]
5、示列代码
MenuData.java:
package com.chaim.special.data.menu;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
//@formatter:off
/**
* 菜单数据(常见三级数据, 比如菜单, 权限, 类型等等, 需要处理成树结构数据)
*
* 源数据:
* [
* MenuBO(id=1547414817916182529, menuParentId=0, name=商品管理, level=1, type=1),
* MenuBO(id=1547414920685019137, menuParentId=0, name=订单管理, level=1, type=1),
* MenuBO(id=1547414986762084353, menuParentId=1547414817916182529, name=商品列表, level=2, type=1),
* MenuBO(id=1547415070325202945, menuParentId=1547414817916182529, name=商品分组, level=2, type=1),
* MenuBO(id=1547415128978350082, menuParentId=1547414986762084353, name=添加, level=3, type=2),
* MenuBO(id=1547415281852342273, menuParentId=1547414986762084353, name=删除, level=3, type=2)
* ]
*
* 期望类型:
* [{
* "id": 1547414817916182529,
* "name": "商品管理",
* "menuVOList": [{
* "id": 1547414986762084353,
* "name": "商品列表",
* "menuVOList": [{
* "id": 1547415128978350082,
* "name": "添加",
* "menuVOList": []
* }, {
* "id": 1547415281852342273,
* "name": "删除",
* "menuVOList": []
* }]
* }, {
* "id": 1547415070325202945,
* "name": "商品分组",
* "menuVOList": []
* }]
* }, {
* "id": 1547414920685019137,
* "name": "订单管理",
* "menuVOList": []
* }]
*
* @author Chaim
* @date 2022/8/25 23:48
*/
//@formatter:on
public class MenuData {
public static void main(String[] args) {
// 模拟数据
List<MenuBO> data = getData();
// 转换数据结构
List<MenuVO> resultList = data.stream()
.filter(menuBO -> 1 == menuBO.getLevel())
.map(menuBO ->
MenuVO.builder()
.id(menuBO.getId())
.name(menuBO.getName())
.menuVOList(getChildren(menuBO, data))
.build())
.collect(Collectors.toList());
System.out.println(data.toString());
System.out.println(resultList.toString());
}
public static List<MenuVO> getChildren(MenuBO menuBO, List<MenuBO> menuBOList) {
return menuBOList.stream()
.filter(item -> item.getMenuParentId().equals(menuBO.getId()))
.map((item) ->
MenuVO.builder()
.id(item.getId())
.name(item.getName())
.menuVOList(getChildren(item, menuBOList))
.build()
)
.collect(Collectors.toList());
}
/**
* 生成模拟数据
*
* @return
*/
public static List<MenuBO> getData() {
List<MenuBO> menuBOList = new ArrayList<>();
MenuBO menuLevelOne = new MenuBO();
menuLevelOne.setId(1547414817916182529L);
menuLevelOne.setMenuParentId(0L);
menuLevelOne.setName("商品管理");
menuLevelOne.setLevel(1);
menuLevelOne.setType(1);
menuBOList.add(menuLevelOne);
MenuBO menuLevelOne2 = new MenuBO();
menuLevelOne2.setId(1547414920685019137L);
menuLevelOne2.setMenuParentId(0L);
menuLevelOne2.setName("订单管理");
menuLevelOne2.setLevel(1);
menuLevelOne2.setType(1);
menuBOList.add(menuLevelOne2);
MenuBO menuLevelTwo = new MenuBO();
menuLevelTwo.setId(1547414986762084353L);
menuLevelTwo.setMenuParentId(1547414817916182529L);
menuLevelTwo.setName("商品列表");
menuLevelTwo.setLevel(2);
menuLevelTwo.setType(1);
menuBOList.add(menuLevelTwo);
MenuBO menuLevelTwo2 = new MenuBO();
menuLevelTwo2.setId(1547415070325202945L);
menuLevelTwo2.setMenuParentId(1547414817916182529L);
menuLevelTwo2.setName("商品分组");
menuLevelTwo2.setLevel(2);
menuLevelTwo2.setType(1);
menuBOList.add(menuLevelTwo2);
MenuBO menuLeveThree = new MenuBO();
menuLeveThree.setId(1547415128978350082L);
menuLeveThree.setMenuParentId(1547414986762084353L);
menuLeveThree.setName("添加");
menuLeveThree.setLevel(3);
menuLeveThree.setType(2);
menuBOList.add(menuLeveThree);
MenuBO menuLeveThree2 = new MenuBO();
menuLeveThree2.setId(1547415281852342273L);
menuLeveThree2.setMenuParentId(1547414986762084353L);
menuLeveThree2.setName("删除");
menuLeveThree2.setLevel(3);
menuLeveThree2.setType(2);
menuBOList.add(menuLeveThree2);
return menuBOList;
}
}
MenuBO.java
package com.chaim.special.data.menu;
import lombok.Data;
/**
* @author Chaim
* @date 2022/8/25 23:48
*/
@Data
public class MenuBO {
/**
* ID
*/
private Long id;
/**
* 父ID
*/
private Long menuParentId;
/**
* 名称
*/
private String name;
/**
* 级别:1-1级,2-2级,3-3级
*/
private Integer level;
/**
* 类型:1-菜单,2-按钮
*/
private Integer type;
}
MenuVO.java
package com.chaim.special.data.menu;
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
* @author Chaim
* @date 2022/8/25 23:48
*/
@Data
@Builder
public class MenuVO {
/**
* ID
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 子级数据
*/
private List<MenuVO> menuVOList;
@Override
public String toString() {
return "{" +
"\"id\":" + id +
", \"name\":\"" + name + '\"' +
", \"menuVOList\":" + menuVOList +
'}';
}
}