栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8+递归实现树状结构数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8+递归实现树状结构数据

一、起因

之前在技术群里发现了有人问类似于树状关系要怎么查询比较好(具体如下)

当时在牛客上也发现有人询问了这个问题。当时考虑到了迭代遍历获取子节点加入,然后下面有人提到了递归于是便想着第二天来实现一下、在中午跟家人聚完餐之后就来进行了实现。

二、实现

自己的表:

springboot准备:这里使用的mybatis-plus来进行查询(lambdaquery是真的好用)

1、统一返回类

@Data
@ApiModel("result")
public class ResultBean implements Serializable {

    @ApiModelProperty("状态码")
    private int code;
    @ApiModelProperty("返回消息")
    private String message;
    @ApiModelProperty("返回数据")
    private T data;
    
    public static ResultBean build(int code , String msg , T data){
        return new ResultBean<>(code,msg , data);
    }

    public static ResultBean ok(T data){
        return new ResultBean<>(data);
    }
//·····一下省略

2、实体类(实际开发需要DTO、vo层的这里我这样写肯定是不规范的)

@Data
@TableName("sql_test_practise")
public class TreeSQL {

    
    private Long id;

    
    private Long pid;

    
    private String content;

    
    @TableField(exist = false)
    private List childNode;
}

3、service层

@Service
public class ITreeSQLService extends ServiceImpl implements TreeSQLService {

}

4、进行测试

1、迭代方式

@GetMapping("/test/1")
public ResultBean> hello(HttpServletRequest request , HttpServletResponse response){
    List treeSQLList = treeSQLService.lambdaQuery().eq(TreeSQL::getPid,"0").list();
    for (TreeSQL treeSQL : treeSQLList){
        List childTreeList = treeSQLService.lambdaQuery().eq(TreeSQL::getPid,treeSQL.getId()).list();
        treeSQL.setChildNode(childTreeList);
        for (TreeSQL child : childTreeList) {
            List grandChildList = treeSQLService.lambdaQuery().eq(TreeSQL::getPid,child.getId()).list();
            child.setChildNode(grandChildList);
        }
    }
    return  ResultBean.ok(treeSQLList);
}

2、递归方式

@GetMapping("/test/2")
public ResultBean> test2(){
    //获取数据库中所有的数据
    List allList = treeSQLService.list();
    
    List treeList = allList.stream().filter(parentNode -> parentNode.getPid()==0L)
            .map(node -> getChild(node, allList)).toList();
    return ResultBean.ok(treeList);
}


public TreeSQL getChild(TreeSQL sql , List allList){
    
    List treeSQL = allList.stream()
            .filter(subNode -> subNode.getPid().equals(sql.getId()))
            .map(subNode -> getChild(subNode, allList)).toList();
    sql.setChildNode(treeSQL);
    return sql;
}
三、比对 1、性能

这里是加了一个过滤器来进行接口性能测试

迭代:

递归:

可以看到性能提升来快5倍

2、结果

在测试的结果中几乎是完全一样的。但是!!

如果在最后一层节点下在新增一个节点的话例如

当前节点有四层,迭代查询的结果由于是两层迭代的原因,所以只能查询到西瓜着一层。

迭代结果:

递归结果:

这里加入业务变化。原本最大是三级结构、后因为需求变成了四级结构,迭代需要继续加一层for、而递归的代码不需要任何的变化。

代码能够适应业务的变化,可以说耦合度完完全全的降低了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996446.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号