使用java8中stream流返回树形结构

使用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流做这个功能,解释的不是很清楚以作为参考,如有不足希望帮忙指出,

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值