java 返回树状类型数据

2023-10-27

最近新来了个前端,菜单等相关功能不想使用前端的数标签,希望后端组装好数结构返回。于是写了个通用型的工具类,供以后遇见类似的问题时使用。

实体类

@Data
public class TreeTest{
    private String id;
    private String parentId;
    private List<TreeTest> children=new ArrayList<>();
    public TreeTest(){};
    public TreeTest(String id){
        this.id=id;
    }
    public TreeTest(String id,String parentId){
        this.id=id;
        this.parentId=parentId;
    }
}

上面构造方法我是为了方便调试使用的,不用在意,但是children=new ArrayList(),这个如果要使用我的工具类的话这里初始化必须写上。

具体实现方法

public static <T,R> List<T> parTree(List<T> list, Function<T, ? extends R> id,
                                          Function<? super T, ? extends R> parent,
                                          Function<? super T, ? extends R> children){
        List<T> list1=new ArrayList();
        Map<Object, T> collect = list.stream().collect(Collectors.toMap(id, t -> t));
        Iterator<Object> iter = collect.keySet().iterator();
        while (iter.hasNext()) {
            T t = collect.get(iter.next());
            Object parentObject = parent.apply(t);
            if(parentObject==null){
                list1.add(t);
            }else{
                T parentT=collect.get(parentObject);
                List<T> childrenList = (List<T>)children.apply(parentT);
                childrenList.add(t);
            }
        }
        return list1;
    }

使用函数的方式来实现,通用性更好。

调用方式如下:

Util.parTree(list, TreeTest::getId, TreeTest::getParentId,
                TreeTest::getChildren);

例如我自己的测试例子:

List<TreeTest> list=new ArrayList(){{
            add(new TreeTest("1"));
            add(new TreeTest("2"));
            add(new TreeTest("3"));
            add(new TreeTest("4","1"));
            add(new TreeTest("5","2"));
            add(new TreeTest("6","3"));
            add(new TreeTest("7","4"));
            add(new TreeTest("8","4"));
            add(new TreeTest("9","7"));
            add(new TreeTest("10","7"));
        }};

        List<TreeTest> list1 = Util.parTree(list, TreeTest::getId, TreeTest::getParentId,
                TreeTest::getChildren);
        System.out.println(list1);

打印出来结果为[TreeTest(id=1, parentId=null, children=[TreeTest(id=4, parentId=1, children=[TreeTest(id=7, parentId=4, children=[TreeTest(id=9, parentId=7, children=[]), TreeTest(id=10, parentId=7, children=[])]), TreeTest(id=8, parentId=4, children=[])])]), TreeTest(id=2, parentId=null, children=[TreeTest(id=5, parentId=2, children=[])]), TreeTest(id=3, parentId=null, children=[TreeTest(id=6, parentId=3, children=[])])] 。

 

主要是利用java是引用地址对象,修改对象的值,实际上其他的引用也跟着发生变化,以及熟悉了一下function的相关用法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 返回树状类型数据 的相关文章

  • 是什么决定了从 lambda 创建哪个函数式接口?

    请考虑这个例子 import java util function Consumer public class Example public static void main String args Example example new
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • java 使用hutool工具进行MD5加密

    引入依赖
  • 咏儿 gz.lrd

    人 生 惬 意 几 个 秋 闲 云 野 鹤 解 春 愁 醉 看 过 往 十 年 数 还 笑 今 朝 小 儿 休
  • 高仿美团主界面<一>

    声明 本demo还未完善 正在持续更新中 先上图吧 这个小demo资源图片全是用青花瓷抠出来的 现在只是完成了 一部分 会持续更行中 有兴趣的朋友可以关注我 我们一起coding 一起分享 然后这个demo很简单 但是有一些小细节可以和大家
  • MySQL性能优化配置/etc/my.cnf参数

    MySQL etc my cnf文件配置 client port 3306 socket var lib mysql mysql sock default character set utf8 mysql no auto rehash 仅允
  • Java多线程使用案例【附可运行代码】

    标题Java多线程使用案例 1 创建线程池 创建任务 将任务提交到线程池中执行 public class Test1 private static Map
  • Parcelable 和 Serializable的区别和使用

    序列化 为了保存在内存中的各种对象的状态 并可以把保存的对象的状态读出来 一 Seralizable介绍 1 Serializable 是java的序列化技术 最简单的使用方式为在需要序列化的class增加implements Serial
  • 快速部署Qsign签名服务器为go-cqhttp或icqq进行签名认证

    rhwong unidbg fetch qsign onekey 用于一键在Windows下部署fuqiuluo unidbg fetch qsign github com 本项目使用1 1 6版本 由于当前go cqhttp 1 1 0
  • cmake:指定install的安装目录

    使用 CMAKE INSTALL PREFIX 来指定 方法1 在执行cmake时指定 cmake DCMAKE INSTALL PREFIX lt 你想要安装的路径 gt 方法二 设置CMAKE INSTALL PREFIX 变量 SET
  • IDEA中plugins中搜索不到插件问题解决

    2018 3 5 IDEA中plugins中搜索不到插件问题解决 由于项目中需要一些简化开发的一些插件 但是在idea中搜索不到任何的插件 很是痛苦 下面提供两种解决办法 一 第一种解决办法 首先进入File gt setting界面 gt
  • 什么是ELK

    什么是ELK ELK 并不是一个技术框架的名称 它其实是一个三位一体的技术名词 ELK 的每个字母都来自一个技术组件 分别是 Elasticsearch 简称 ES Logstash 和 Kibana 三个技术组件是独立的 后两个被elas
  • pcl中ransac提取直线_pcl学习笔记1

    文 云师弟 源 云师弟 编 云师弟 文仅交流 如侵联删 点击上方 云师弟的学习空间 关注 星标 获取有趣 好玩的前沿干货 PCL The Point Cloud Library 是用于2D 3D图像和点云处理的大规模开放项目 开源软件 它是
  • 小程序数据证明采集_小程序数据埋点实践之曝光量

    什么是数据埋点 所谓数据埋点就是应用在规定流程中 对特定行为或事件进行数据采集 使用采集的数据做用户分析和页面分析 可以获得应用的总体使用情况 为后续优化产品和运营提供数据支撑 常见数据埋点内容包括 访问量 停留时长 曝光量 点击量 跳出率
  • docker 命令查看当前所有服务的物理性能命令

    docker stats no stream docker ps awk NR gt 1 print NF grep wmy CONTAINER sort n r k 8 docker stats 查看每个容器状态 no stream 当前
  • 简单几步,用Visual Studio写出并运行一个c程序

    1 首先请确保安装了相应的IDE 作者使用的VS版本为最新 已目前文章发布时间为准 的2022版本 而版本只要不是太远古本方法通用 2 创建一个新项目 打开VS 点击创建新项目 找到c 的空项目 点击使其创建 更换项目名称 点击右下角创建
  • 【Yarn】Yarn StateMechine有限状态机

    文章目录 1 概述 2 StateMachine 2 1 InternalStateMachine 2 1 1 maybeMakeStateMachineTable 2 2 StateMachineFactory 2 2 1 获取实例 2
  • Available Packages显示nothing to show

    项目场景 pycharm添加包 use conda package manager 问题描述 在使用pycharm添加包时availiable packages 显示nothing to show 且右上角一直刷新 原因分析 安装的时候an
  • python中int的功能_Python内置函数int()高级用法

    int 函数常用来把其他类型转换为整数 例如 gt gt gt int 3 2 3 gt gt gt int 1 3 0 其实 int是Python内置类型之一 之所以能够当作函数来用 是因为它提供了构造方法 另外 它还提供了第二个参数支持
  • upload-labs靶场通关指南(第1-3关)

    今天继续给大家介绍渗透测试相关知识 本文主要内容是upload labs靶场通关指南 第1 3关 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一
  • 数据库引用

    目录 1 手动引用 1 1 背景 1 2 程序 1 3 使用 2 数据库引用 DBRef 2 1 背景 2 2 格式 2 3 支持数据库引用的驱动程序 2 4 使用 进入MongoDB中文手册 4 2版本 目录 对于MongoDB中的许多用
  • java 返回树状类型数据

    最近新来了个前端 菜单等相关功能不想使用前端的数标签 希望后端组装好数结构返回 于是写了个通用型的工具类 供以后遇见类似的问题时使用 实体类 Data public class TreeTest private String id priv