前言:

在开发中,我们经常见到,前端展示树状结构的,这时候就需要后端去封装一个多级树结构对象,前端根据这样结构的数据去渲染数据,这篇文章讲的是如何封装成多级树结构对象。

正文:

1.先封装个树结构的对象

@Data
public class TreeDto {
private String id;
private String name;
private String pid;
private String isParent;
private List<TreeDto> childTreeDto; }

2.然后我把工具类代码粘贴下

public class TreeToolUtils {
private List<TreeDto> rootList; //根节点对象存放到这里 private List<TreeDto> bodyList; //其他节点存放到这里,可以包含根节点 public TreeToolUtils(List<TreeDto> rootList, List<TreeDto> bodyList) {
this.rootList = rootList;
this.bodyList = bodyList;
} public List<TreeDto> getTree(){ //调用的方法入口
if(bodyList != null && !bodyList.isEmpty()){
//声明一个map,用来过滤已操作过的数据
Map<String,String> map = Maps.newHashMapWithExpectedSize(bodyList.size());
rootList.forEach(beanTree -> getChild(beanTree,map));
return rootList;
}
return null;
} public void getChild(TreeDto treeDto,Map<String,String> map){
List<TreeDto> childList = Lists.newArrayList();
bodyList.stream()
.filter(c -> !map.containsKey(c.getId()))
.filter(c ->c.getPid().equals(treeDto.getId()))
.forEach(c ->{
map.put(c.getId(),c.getPid());
getChild(c,map);
childList.add(c);
});
treeDto.setChildTreeDto(childList); }
}

3.然后写个main方法来测试下

TreeDto treeDto = new TreeDto("1", "总店", "null", "true",null);
TreeDto treeDto1 = new TreeDto("2", "市分店", "1", "true",null);
TreeDto treeDto2 = new TreeDto("3", "县分店", "2", "true",null);
TreeDto treeDto3 = new TreeDto("710", "店长", "3", "true",null);
TreeDto treeDto4= new TreeDto("713", "财务部", "3", "true",null);
TreeDto treeDto5 = new TreeDto("20032", "后勤部", "3", "true",null);
TreeDto treeDto6 = new TreeDto("1909", "小王", "710", "false",null);
TreeDto treeDto7= new TreeDto("1974", "小张", "713", "false",null);
TreeDto treeDto8 = new TreeDto("388187", "佳佳", "20032", "false",null);
TreeDto treeDto9 = new TreeDto("1949", "阿达", "20032", "false",null);
ArrayList<TreeDto> rootList = new ArrayList<>();//根节点
ArrayList<TreeDto> bodyList = new ArrayList<>();//子节点
rootList.add(treeDto);
bodyList.add(treeDto1);
bodyList.add(treeDto2);
bodyList.add(treeDto3);
bodyList.add(treeDto4);
bodyList.add(treeDto5);
bodyList.add(treeDto6);
bodyList.add(treeDto7);
bodyList.add(treeDto8);
bodyList.add(treeDto9);
TreeToolUtils utils = new TreeToolUtils(rootList,bodyList);
List<TreeDto> result = utils.getTree();
String jsonString = JSONObject.toJSONString(result.get(0));
System.out.println(jsonString);
}

4.最后控制台打印出的结果格式化后,就是这样的数据啦,前端根据层级去渲染数据就行啦

{
    "childTreeDto": [{
        "childTreeDto": [{
            "childTreeDto": [{
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "1909",
                    "isParent": "false",
                    "name": "小王",
                    "pid": "710"
                }],
                "id": "710",
                "isParent": "true",
                "name": "店长",
                "pid": "3"
            }, {
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "1974",
                    "isParent": "false",
                    "name": "小张",
                    "pid": "713"
                }],
                "id": "713",
                "isParent": "true",
                "name": "财务部",
                "pid": "3"
            }, {
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "388187",
                    "isParent": "false",
                    "name": "佳佳",
                    "pid": "20032"
                }, {
                    "childTreeDto": [],
                    "id": "1949",
                    "isParent": "false",
                    "name": "阿达",
                    "pid": "20032"
                }],
                "id": "20032",
                "isParent": "true",
                "name": "后勤部",
                "pid": "3"
            }],
            "id": "3",
            "isParent": "true",
            "name": "县分店",
            "pid": "2"
        }],
        "id": "2",
        "isParent": "true",
        "name": "市分店",
        "pid": "1"
    }],
    "id": "1",
    "isParent": "true",
    "name": "总店",
    "pid": "null"
}

原文:https://blog.csdn.net/jdk_wangtaida/article/details/87867620

Java代码实现封装多级树结构对象的更多相关文章

  1. Java代码质量改进之:同步对象的选择

    在Java中,让线程同步的一种方式是使用synchronized关键字,它可以被用来修饰一段代码块,如下: synchronized(被锁的同步对象) { // 代码块:业务代码 } 当synchro ...

  2. [改善Java代码] 推荐使用序列化实现对象的拷贝

    建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...

  3. Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...

  4. Java代码质量改进之:使用ThreadLocal维护线程内部变量

    在上文中,<Java代码质量改进之:同步对象的选择>,我们提出了一个场景:火车站有3个售票窗口,同时在售一趟列车的100个座位.我们通过锁定一个靠谱的同步对象,完成了上面的功能. 现在,让 ...

  5. 《java JDK7 学习笔记》之对象封装

    1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...

  6. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  7. Java面向对象的基本概念(对象、封装、继承、多态、抽象、接口、泛型)

    对象:是一个自包含的实体,用一组可识别的特征和行为来标识. 类:具有相同的属性和功能的对象的抽象合集.(类关键字class,首字母大写). 实例:就是一个真实的对象. 实例化:创建对象的过程,关键字是 ...

  8. 【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。

    Eclipse中导入外部jar包 在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可. 工具/原料 Eclipse 需要 ...

  9. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

随机推荐

  1. TCP-IP详解笔记3

    TCP-IP详解笔记3 地址解析协议 IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作. 网络层软件使用的地址和底层网络硬件使用的地址之间进行转换. 对于TCP/IP网络,地址解析协议( ...

  2. python学习第23天

    isinstance和issubclass 反射: 反射对象中的内容 反射类中的内容 反射本文件中的内容 反射模块中的内容

  3. 【原创】大叔问题定位分享(3)Kafka集群broker进程逐个报错退出

    kafka0.8.1 一 问题现象 生产环境kafka服务器134.135.136分别在10月11号.10月13号挂掉: 134日志 [2014-10-13 16:45:41,902] FATAL [ ...

  4. vue.js过滤器

    import Vue from 'vue' import { ENV } from '@/config/conf' const dateFormat = (str) => { var date ...

  5. 解构声明(Destructuring Declarations)

    解构声明的概念和作用 把一个对象成员解构(destructure)成多个变量,称为解构声明(destructuring declaration). component1(),component2()等 ...

  6. asp.net core 通过ajax调用后台方法(非api)

    1.    在Startup.cs文件中添加:        services.AddMvc();            services.AddAntiforgery(o => o.Heade ...

  7. 使用Pycharm创建一个Django项目

    在使用python写脚本一段时间后,想尝试使用Django来编写一个python项目,现做以下记录备忘: 1.创建项目 如果本地没有安装与所选python版本对应Django版本,pycharm会自动 ...

  8. 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法

    1.改变background-size属性 将图片作为某个html元素的背景图片,用transition属性改变图片的大小. .container{ background-size: 100% 100 ...

  9. 安装Pycharm——靠谱的Pycharm安装详细教程

    1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己 ...

  10. #Node.js的fs导入遇到的问题和解决方案

    一直在使用VS Code,今天打算用Node.js进行文件IO时候遇到了一些问题,fs是Node.js的核心功能之一,一开始我用Javascript编写fs模块的导入. var fs = requir ...