参考资料
- Java8新特性-使用Stream流递归实现遍历树形结构
一. 实体类
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class Menu {
// 菜单id
public Integer id;
// 菜单名称
public String name;
// 菜单父级id
public Integer parentId;
// 菜单子级id列表
public List<Menu> childList;
public Menu(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.childList = childList;
}
}
二. 模拟查询树形结构数据
- ID为2,6,11的Menu 是 ID为1的Menu子节点
- ID为3,4,5的Menu 是 ID为2的Menu子节点
private List<Menu> queryDataFromDB() {
// 模拟从数据库查询得到数据
return Arrays.asList(
new Menu(1, "根节点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),
new Menu(13, "根节点2", 0),
new Menu(14, "子根节点1", 13),
new Menu(15, "子根节点2", 13)
);
}
三. 使用stream流处理为树形结构
public void run(String... args) {
List<Menu> menuList = this.queryDataFromDB();
List<Menu> resultList = menuList.stream()
// 过滤出根节点
.filter(menu -> menu.getParentId() == 0)
.peek(menu -> menu.setChildList(this.getChildList(menu, menuList)))
.collect(Collectors.toList());
// 🧐最终得到树形结构数据
System.out.println(resultList);
}
private List<Menu> getChildList(Menu rootMenu, List<Menu> menuList) {
return menuList.stream()
// 过滤出ParentId和指定的id相等的数据
.filter(menu -> Objects.equals(menu.getParentId(), rootMenu.getId()))
// 递归调用
.peek(menu -> menu.setChildList(this.getChildList(menu, menuList)))
.collect(Collectors.toList());
}
💥注意文章来源:https://www.toymoban.com/news/detail-788985.html
// ...
.peek(menu -> menu.setChildList(this.getChildList(menu, menuList)))
// ...
是下面这种写法的一种更简单的写法文章来源地址https://www.toymoban.com/news/detail-788985.html
// ...
.map(menu -> {
menu.setChildList(this.getChildList(menu, menuList));
return menu;
})
// ...
四. 处理完的树形结构数据
[
{
"id": 1,
"name": "根节点1",
"parentId": 0,
"childList": [
{
"id": 2,
"name": "子根节点1",
"parentId": 1,
"childList": [
{
"id": 3,
"name": "子节点1.1",
"parentId": 2,
"childList": []
},
{
"id": 4,
"name": "子节点1.2",
"parentId": 2,
"childList": []
},
{
"id": 5,
"name": "子节点1.3",
"parentId": 2,
"childList": []
}
]
},
{
"id": 6,
"name": "子根节点2",
"parentId": 1,
"childList": [
{
"id": 7,
"name": "子节点2.1",
"parentId": 6,
"childList": []
},
{
"id": 8,
"name": "子节点2.2",
"parentId": 6,
"childList": [
{
"id": 9,
"name": "子节点2.2.1",
"parentId": 8,
"childList": []
},
{
"id": 10,
"name": "子节点2.2.2",
"parentId": 8,
"childList": []
}
]
}
]
},
{
"id": 11,
"name": "子根节点3",
"parentId": 1,
"childList": [
{
"id": 12,
"name": "子节点3.1",
"parentId": 11,
"childList": []
}
]
}
]
},
{
"id": 13,
"name": "根节点2",
"parentId": 0,
"childList": [
{
"id": 14,
"name": "子根节点1",
"parentId": 13,
"childList": []
},
{
"id": 15,
"name": "子根节点2",
"parentId": 13,
"childList": []
}
]
}
]
到了这里,关于Java8 Stream流处理树形结构数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!