hierarchy-utils 通用树形数据工具库

2024-04-15 15:12

本文主要是介绍hierarchy-utils 通用树形数据工具库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通用树形数据工具库

  • hierarchy-utils
    • 链接地址
    • 使用示例
      • 数据结构 - 菜单
      • 数据源
      • 1.通过原数据结构返回树形数据
      • 2.通过转换数据结构(Map / JSONObject)返回树形数据
      • 3.返回源数据列表中id为rootId的元素或pid为rootId且id能整除2的全部子元素的数据列表 (支持将树形数据打平及过滤)
      • 4.怎样对指定的返回结果列表进行排序的方法

hierarchy-utils

用于构建/查找具有层级关系树形数据的工具库,以解决业务中常见的树形数据处理需求
支持自定义过滤数据、排序及转换数据等

链接地址

https://github.com/joker-pper/hierarchy-utils

使用示例

数据结构 - 菜单

@Data
public class Menu {private Integer id;private String name;private Integer pid;private Integer sort;private List<Menu> children;
}

数据源

    //查询当前用户的菜单列表List<Menu> menuList = menuService.findAllByUserId();//通过json转换List<Menu> menuList = JSONObject.parseArray(menuText, Menu.class);;

1.通过原数据结构返回树形数据

       //默认根元素为-1 (当前所有一级菜单的pid为-1,可根据实际定义根元素使用)Integer rootId = -1;//排序(需注意业务属性值是否为空),可选Comparator<Menu> comparator = Comparator.comparingInt(Menu::getSort);HierarchyUtils.HierarchyFunctions<Menu, Integer, Menu> defaultFunctions = new HierarchyUtils.HierarchyFunctions<>();//获取piddefaultFunctions.setGetPidFunction(data -> data.getPid());//获取iddefaultFunctions.setGetIdFunction(data -> data.getId());//验证是否为rootdefaultFunctions.setIsRootFunction(id -> Objects.equals(rootId, id));//设置childrendefaultFunctions.setSetChildrenFunction((parent, children) -> {parent.setChildren(children);});//是否返回root元素(未设置时默认false,开启时root元素必须存在)defaultFunctions.setIsWithRoot(() -> false);//过滤条件(可选,用来筛选数据)defaultFunctions.setFilterPredicate(menu -> true);List<Menu> hierarchyResult = HierarchyUtils.getHierarchyResult(menuList,defaultFunctions,comparator);System.out.println(JSONObject.toJSONString(hierarchyResult));

2.通过转换数据结构(Map / JSONObject)返回树形数据

    //默认根元素为-1 (当前所有一级菜单的pid为-1,可根据实际定义根元素使用)Integer rootId = -1;//排序(需注意业务属性值是否为空),可选Comparator<Menu> comparator = Comparator.comparingInt(Menu::getSort);HierarchyUtils.HierarchyFunctions<Menu, Integer, JSONObject> transferFunctions = new HierarchyUtils.HierarchyFunctions<>();//获取pidtransferFunctions.setGetPidFunction(data -> data.getPid());//获取idtransferFunctions.setGetIdFunction(data -> data.getId());//验证是否为roottransferFunctions.setIsRootFunction(id -> Objects.equals(rootId, id));//设置转换函数transferFunctions.setTransferFunction(menu -> {//转换数据JSONObject result = (JSONObject) JSON.toJSON(menu);//可定义或移除属性result.put("title", menu.getName());result.put("order", menu.getSort());result.put("newName", menu.getName());result.remove("name");return result;});//设置childrentransferFunctions.setSetChildrenFunction((parent, children) -> {parent.put("children", children);});//是否返回root元素(未设置时默认false,开启时root元素必须存在)transferFunctions.setIsWithRoot(() -> false);//过滤条件(可选,用来筛选数据)transferFunctions.setFilterPredicate(menu -> true);List<JSONObject> transferResults = HierarchyUtils.getHierarchyResult(menuList,transferFunctions,comparator);System.out.println(JSONObject.toJSONString(transferResults));

3.返回源数据列表中id为rootId的元素或pid为rootId且id能整除2的全部子元素的数据列表 (支持将树形数据打平及过滤)

Integer rootId = 1;HierarchyFlatUtils.HierarchyFlatFunctions<Menu, Integer, Menu> functions = new HierarchyFlatUtils.HierarchyFlatFunctions<>();//获取pidfunctions.setGetPidFunction(data -> data.getPid());//获取idfunctions.setGetIdFunction(data -> data.getId());//验证是否为rootfunctions.setIsRootFunction(id -> Objects.equals(rootId, id));//是否返回root元素(未设置时默认false,开启时root元素必须存在)functions.setIsWithRoot(() -> true);//是否返回全部的子元素(未设置时默认false,即默认只返回root元素的直接子元素)functions.setIsWithAllChildren(() -> true);//过滤条件(可选,用来筛选数据)functions.setFilterPredicate(menu -> menu.getId() % 2 == 0 || Objects.equals(rootId, menu.getId()));//排序(需注意业务属性值是否为空),可选Comparator<Menu> comparator = Comparator.comparingInt(Menu::getSort);List<Menu> matchResults = HierarchyFlatUtils.getHierarchyFlatResult(menuList,functions,comparator);//对返回结果排序(需注意业务属性值是否为空),可选HierarchySortUtils.sort(matchResults, comparator);System.out.println(JSONObject.toJSONString(matchResults));

4.怎样对指定的返回结果列表进行排序的方法

    //对返回结果排序 (只排序当前列表,不会递归排序子元素)HierarchySortUtils.sort(list, comparator); //对返回结果及子元素排序(递归排序)HierarchySortUtils.sortWithChildren(list, childrenFunction, comparator);  

这篇关于hierarchy-utils 通用树形数据工具库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906169

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数