Java接口常见场景:返回树形结构

一、背景

在日常开发过程中,树形结构是一种非常常见的数据结构。它由节点组成,每个节点可以有多个子节点。这种结构在许多应用场景中都非常有用,例如文件系统、数据库索引、组织架构等。在Java中,我们可以使用类和方法来表示树形结构,并实现对其进行操作的方法。

二、代码示例

2.1 通用树形BaseTree类

下面的通用类只是一个示例,大家可以根据自己项目的需求进行调整,比如idLong类型的等等。

java 复制代码
/**
 * <p>Description: 统一树结构</p>
 */
@Data
@ApiModel(description = "统一树结构")
public class BaseTree<T> {

    @ApiModelProperty("主键")
    private String id;

    @ApiModelProperty("父节点id")
    private String parentId;

    @ApiModelProperty("层级")
    private Integer tier;

    @ApiModelProperty("子节点")
    private List<T> children = CollUtil.newArrayList(); 
}
2.2 实际返回VO

这里面的内容也可以根据自己实际要返回的数据,进行修改调整,下面只是一个示例:

java 复制代码
/**
 * <p>类型返回VO</p>
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "<p>类型返回VO对象</p>")
public class TypeVO extends BaseTree<TypeVO> {

    @ApiModelProperty(value = "类别编码")
    private String code;

    @ApiModelProperty(value = "类别名称")
    private String name;
}
2.3 树形处理TreeUtils工具类

逻辑也都很清晰,主要传入一个集合列表,然后找到parentId不为空,或者传入就有parentId,将其设置为层级为1的主节点,然后通过主节点依次往下查找子节点,构建子树里面采用了递归的方式进行处理。

java 复制代码
public class TreeUtils {

    /**
     * 构建树(必须是有序的列表)
     */
    public static <T extends BaseTree> List<T> buildTree(List<T> treeNodes, String root) {
        List<T> trees = CollUtil.newArrayList();
        for (T treeNode : treeNodes) {
            if (CharSequenceUtil.isBlank(treeNode.getParentId()) || (ObjectUtil.isNotNull(root) && root.equals(treeNode.getParentId()))) {
                // 遍历的数据为一级
                treeNode.setTier(1);
                trees.add(treeNode);
                setChildrenTier(treeNode, treeNodes, 2); // 设置子节点的tier,从第二层开始,初始tier为2
            }
        }
        return trees;
    }

    /**
     * 构建子树
     */
    private static <T extends BaseTree> void setChildrenTier(T parentNode, List<T> treeNodes, int tier) {
        for (T it : treeNodes) {
            if (CharSequenceUtil.isNotBlank(it.getParentId()) && it.getParentId().equals(parentNode.getId())) {
                if (ObjectUtil.isNull(it.getChildren())) {
                    it.setChildren(CollUtil.newArrayList());
                }
                it.setTier(tier); // 设置节点的tier
                parentNode.getChildren().add(it);
                setChildrenTier(it, treeNodes, tier + 1); // 递归调用设置子节点的tier,tier加1
            }
        }
    }
}
2.4 测试结果

下面列举了一个非常建议的测试案例,首先从数据库里面查询出所有的type的数据,然后调用我们上面写好的TreeUtils进行处理,代码如下所示:

java 复制代码
   @Override
    public List<TypeVO> listAllTypesTrees() {
        List<TypeVO> typeList = typebaseMapper.selectTypes();
        return TreeUtils.buildTree(typeList, null);
    }

调用结果json

json 复制代码
{
    "message": "操作成功",
    "code": "0",
    "data": [
        {
            "id": "4a7af8949d606024ee37acf3a578b96e",
            "parentId": null,
            "tier": 1,
            "children": [
                {
                    "id": "29486803c75db91ea90722ea7db582ce",
                    "parentId": "4a7af8949d606024ee37acf3a578b96e",
                    "tier": 2,
                    "children": [],
                    "code": "11",
                    "name": "type1-1",
                },
                {
                    "id": "406727615a6c2859d1ca8f3a4f80069a",
                    "parentId": "4a7af8949d606024ee37acf3a578b96e",
                    "tier": 2,
                    "children": [],
                    "code": "12",
                    "name": "type1-2"
                }
            ],
            "code": "1",
            "name": "type1"
        },
        {
            "id": "9eed152b4e20ff10e76b33f5dd8cc4d2",
            "parentId": null,
            "tier": 1,
            "children": [],
            "code": "2",
            "name": "type2"
        },
        {
            "id": "d1fcdbf4da384bf454aa14276cee25b1",
            "parentId": null,
            "tier": 1,
            "children": [],
            "code": "3",
            "name": "type3"
        }
    ]
}

三、总结

Java接口返回树形结构的方式主要有以下几种:1. 使用嵌套的List ;2. 使用递归方法;3. 使用JSON格式的数据。这些方式的优势在于可以方便地表示和处理具有层级关系的数据,使得代码更加简洁、易读。同时,通过接口返回树形结构,可以实现数据的动态加载,提高系统的性能。此外,使用JSON格式的数据还可以方便地进行跨平台的数据交换和解析。总之,Java接口返回树形结构的方式在处理复杂数据结构时具有很大的优势,有助于提高代码的可维护性和扩展性。

相关推荐
张张张3125 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~8 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL24 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing25 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿