使用java8中stream流返回树形结构
这里我暂时不连接数据库,有些麻烦实现原理都是差不多的,仅供参考学习。
准备工作:
- 使用IDEA
- 创建一个java项目
- New > Project > java
二、使用步骤
代码如下(示例):第一步创建一个Menu对象,需要生成构造和get/set方法
@Data
@Builder
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;
}
public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.childList = childList;
}
代码如下(示例):第二步,创建一个测试类,创建list集合模拟从数据库读取回来的数据。
//模拟从数据库读取回来的数据
public static List<Menu> menus = Arrays.asList(
new Menu(1, "父节点1", 0),
new Menu(2, "父节点2", 0),
new Menu(3, "子节点1", 1),
new Menu(4, "子节点2", 2),
new Menu(5, "子节点1-1", 1),
new Menu(6, "子节点2-2", 2)
);
代码如下(示例):第三步,具体实现代码,使用java8中stream流
public static void main(String[] args) {
//父节点:menus是集合元素
List<MenuVo> collect = menus.stream().filter(node -> node.getParentId() == 0)
.map(menu -> {
menu.setChildList(getChildList(menu, menus));
MenuVo menuVo = new MenuVo(); //这两步可有可无,根据需要的信息进行返回
BeanUtils.copyProperties(menu, menuVo);
return menuVo;
}) .collect(Collectors.toList());
System.out.println(JSON.toJSON(collect));
//获取子节点方法
private List<Menu> getChildList(Menu root, List<Menu> all) {
List<Menu> collect = all.stream().filter(menu -> {
return Objects.equals(menu.getParentId(), root.getId());
}).map(menu -> {
menu.setChildList(getChildList(menu, all));
return menu;
}).collect(Collectors.toList());
return collect;
}
}
返回结果:
[
{
"name":"父节点1",
"childList":[
{
"name":"子节点1",
"childList":[
],
"id":3,
"parentId":1
},
{
"name":"子节点1-1",
"childList":[
],
"id":5,
"parentId":1
}
]
},
{
"name":"父节点2",
"childList":[
{
"name":"子节点2",
"childList":[
],
"id":4,
"parentId":2
},
{
"name":"子节点2-2",
"childList":[
],
"id":6,
"parentId":2
}
]
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了树形结构数据的基本使用,以及学习了java8的语法,本人也是第一次使用java8的stream流做这个功能,解释的不是很清楚以作为参考,如有不足希望帮忙指出,