java后端实现树形结构实体类

文章讲述了在Java后端实现树形结构的方法,通过创建TreeNode实体类和提供构建树形结构的工具类,强调了后端处理树形结构在大数据量时对服务器的压力,同时提到了前端实现的效率问题。作者还提及了使用layui或ant-design-vue在前端展示树形结构的可能性,并提到数据优化策略如懒加载和使用缓存。
摘要由CSDN通过智能技术生成

java后端实现树形结构

  1. 现实功能需求中许多都要使用后端来实现树形结构的实体类,如果放在前端进行实现,会非常影响效率,浏览器加载的资源过多,会导致页面非常的卡顿,这种卡顿的压力就给后端来实现了,如果给后端来实现的话,对服务器的压力也是相当的大(数据量大的情况),如果是数据量不大的情况下,放在前端实现和放在后端实现其实都是一样的
  2. 这里我先讲解一下使用后端来实现树形结构,下一篇文章讲解使用layui(javascript)来展示树形结构,或者使用ant-design-vue(vue)来讲解,看心情吧(其实也是做个笔记,方便下次直接ctrl+c,ctrl+v,不用自己在写一遍了)
  3. 各位码农能看到这篇文章的基本上也是知道自己要实现什么功能,这里我就不说树形结构是啥了,不然也看不到我这篇文章
  4. 在java中,万事皆是对象,所以首先我们要先创建返回的对象
package com.liu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 返回的实体类对象
 * 额外可以自己添加属性 这里只是一个最普通的,看自己的需求添加其他的属性
 * @author Mr.zhou
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode {
    /** 节点ID */
    private String code;

    /** 父节点ID:顶级节点为0 */
    private String parsentId;

    /** 节点名称 */
    private String name;

    /** 子节点 
     *  本质其实就是自己这个实体类对象
     * */
    private List<TreeNode> children;
}


  1. 创建形成树形结构的工具类—注释都在代码里面
这里只是一个工具类,是抽离出来放在uitls类中的,也是设置了static的修饰符,可以直接使用类名进行调用,如果不加static修饰符,那就要使用对象来进行调用,加入static方便调用,直接传入对象集合进来就行
  /**
     * 构建部门树结构
     * @param treeNodeList  部门列表
     * @return
     */
    public static List<TreeNode> buildTree(List<TreeNode> treeNodeList) {
        // 形成的树形结构集合
        List<TreeNode> list = new ArrayList<>();
        // 对当前的部门进行循环遍历
        for (TreeNode item : treeNodeList) {
            // 获取到顶级部门
           if ("".equals(item.getParsentId())) {
               // 获取顶级部门下一层的子部门
               TreeNode children = findChildren(item, treeNodeList);
               list.add(children);
           }
        }
        // 形成部门树返回
        return list;
    }

    /**
     * 查询子部门数据
     * @param treeNode 当前部门
     * @param treeNodeList 部门列表
     * @return
     */
    public static TreeNode findChildren(TreeNode treeNode, List<TreeNode> treeNodeList) {
        // 以防万一  treeNode.getChildren()默认是null,会出现空指针的情况,默认设置一个空集合
        treeNode.setChildren(new ArrayList<>());
        // 遍历所有的部门列表
        for (TreeNode item : treeNodeList) {
            // 如果当前对象的code等于循环中对象的parsentId相等,说明遍历中的这个对象是当前部门对象的子部门---说的有点抽象
            if (treeNode.getCode().equals(item.getParsentId())) {
                // 本来是一条都没有的,有可能会是null,但是在最前面设置了treeNode.setChildren(new ArrayList<>());这行代码
                // 基本上也不会在这里出现空指针的问题,以防万一
                // 加上这句判断性能有所影响,没加速度会快一点
                // 加上 ---- 5678毫秒, 未加上----3620毫秒
//                if (treeNode.getChildren() == null) {
//                    // 如果为null,就设置一个空集合
//                    treeNode.setChildren(new ArrayList<>());
//                }

                // 递归调用自己的方法,查询子部门----逻辑应该是查询最底部的开始,先从最底下开始封装
                treeNode.getChildren().add(findChildren(item,treeNodeList));
                // 这行只查询两级,因为没有调用自己的方法----没有实现递归
//                treeNode.getChildren().add(item);
            }
        }
        return treeNode;
    }
  1. 后面至于怎么调用,都接触到这里了,应该不用我解释了,返回的数据就是树形结构的数据,前端拿到数据展示就行,可以使用layui框架来实现,牛逼的话就直接使用前端三剑客来实现吧
  2. 这里有说一点,这个是可以优化的代码,这里我是将全部的数据拿出来,整理成一个树形结构,如果是数据量很大的情况下,服务器压力会很大,前端的压力也是非常巨大的,因为前端需要渲染。所以这里你们可以优化,可以使用懒加载来实现这种树形结构,先查出一级的数据,然后根据一级的code代码,找出他子类的数据,这样优化的性能远远超出我这个代码的性能,当然你们也可以放在缓存中。看你们自己的需求,我这里数据量也就一万多条,还能扛得住
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_46855885

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值