首页 > 编程语言 >基于spring boot Java的数组转树状结构类

基于spring boot Java的数组转树状结构类

时间:2024-05-11 11:08:59浏览次数:14  
标签:Java String spring boot data viewObjectClass fid entityClass List

基于spring boot的数组转树状结构类

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public class Array{

    private <E, V> V createViewObject(E entity, Class<V> viewObjectClass) throws Exception {
        V viewObject = viewObjectClass.getDeclaredConstructor().newInstance();
        for (Method method : viewObjectClass.getMethods()) {
            if (method.getName().startsWith("set")) {
                String propertyName = method.getName().substring(3);
                Method getter = findGetter(entity.getClass(), propertyName);
                if (getter != null) {
                    Object value = getter.invoke(entity);
                    method.invoke(viewObject, value);
                }
            }
        }
        return viewObject;
    }

    private Method findGetter(Class<?> clazz, String propertyName) {
        try {
            return clazz.getMethod("get" + propertyName);
        } catch (NoSuchMethodException e) {
            return null;
        }
    }

    private <E, V> List<V> childrenMain(List<E> data, String fid, Function<E, V> ucode, Class<E> entityClass, Class<V> viewObjectClass) throws Exception {
        List<V> result = new ArrayList<>();
        for (E entity : data) {
            // Assuming fid is a property in entity class
            String entityId = (String) entityClass.getMethod("getId").invoke(entity);
            String entityFid = (String) entityClass.getMethod("getFid").invoke(entity);
            if (entityFid.equals(fid)) {
                List<V> children = childrenMain(data, entityId, ucode, entityClass, viewObjectClass);
                V viewObject;
                if(ucode!=null){
                    viewObject = ucode.apply(entity);
                }else {
                    viewObject=createViewObject(entity, viewObjectClass);
                }
                // Assuming there's a setter for children in viewObject class
                viewObjectClass.getMethod("setChildren", List.class).invoke(viewObject, children);
                if (viewObject != null) {
                    result.add(viewObject);
                }
            }
        }
        return result;
    }

    /**
     * 将具有层级关系的二维数组转换为树状数组
     * @param data 数组
     * @param fid 顶级ID
     * @param entityClass 数据库实体的类
     * @param viewObjectClass 转换后的视图对象类
     * @return 转换后的视图对象类
     */
    public <E, V> List<V> children(List<E> data, String fid,Class<E> entityClass, Class<V> viewObjectClass) throws Exception {
        return this.childrenMain(data,fid,null,entityClass,viewObjectClass);
    }

    /**
     * 将具有层级关系的二维数组转换为树状数组
     * @param data 数组
     * @param fid 顶级ID
     * @param ucode  闭包函数
     * @param entityClass 数据库实体的类
     * @param viewObjectClass 转换后的视图对象类
     * @return 转换后的视图对象类
     */
    public <E, V> List<V> children(List<E> data, String fid,Function<E, V> ucode,Class<E> entityClass, Class<V> viewObjectClass) throws Exception {
        return this.childrenMain(data,fid,ucode,entityClass,viewObjectClass);
    }

    public static <E, V> List<V> childrenUtil(List<E> data, String fid,Function<E, V> ucode,Class<E> entityClass, Class<V> viewObjectClass) throws Exception {
        Array array=new Array();
        return array.childrenMain(data,fid,ucode,entityClass,viewObjectClass);
    }
    public static <E, V> List<V> childrenUtil(List<E> data, String fid,Class<E> entityClass, Class<V> viewObjectClass) throws Exception {
        Array array=new Array();
        return array.childrenMain(data,fid,null,entityClass,viewObjectClass);
    }
}

use

 List<PermissionsEntity> permissionsEntities = permissionsMapper.selectList(null);
        List<AccountPermissionsVo> res=Array.childrenUtil(permissionsEntities,"0",PermissionsEntity.class,AccountPermissionsVo.class);
        return res;

other

VO

@Data
public class AccountPermissionsVo {
    private String id;
    private String fid;
    private String name;
    private String rid;
    private List<AccountPermissionsVo> children;
}

标签:Java,String,spring,boot,data,viewObjectClass,fid,entityClass,List
From: https://www.cnblogs.com/xfstu/p/18186119

相关文章

  • java常用加密手段
    虽然一般都会给APK上壳。但是拖壳还是要分析JAVa链接:https://pan.baidu.com/s/1Qm0cF0u7RCGy174QYeVf2Q?pwd=c60g提取码:c60g1.隐藏字节-将明文字符串->转为字节定义publicstaticvoidmain(String[]args)throwsIOException{Stringstrq=newString(newbyte[]{97,......
  • 第一个JAVA代码
    第一个JAVA代码创建存放代码的文件夹在合适的路径中新建存放代码的文件夹。新建一个Java文件1.新建一个文件2.文件名为HelloWorld3.将后缀改为.java输入代码使用notepad++打开新建的文件,输入以下代码并保存publicclassHelloWorld{ publicstaticvoidmain(String[]a......
  • Spring中的单例bean
    Spring框架中的单例bean是线程安全的吗?不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。Spring框架并没......
  • Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
    Spring中的Bean是否线程安全取决于Bean的作用域(scope)。Spring提供了几种不同的Scope,其中包括Singleton、Prototype、Request、Session、GlobalSession等。 SingletonScope(单例模式)默认情况下,SpringBean是SingletonScope,这意味着在整个应用程序上下文中只有一个实例。......
  • Springboot Data Jdbc中Contains和Containing的用法
    Contains和Containing的用法privateStringtitle;privateList<String>tags;//查询标题包含指定字符串的书籍List<Book>findByTitleContains(Stringtitle);//查询包含指定标签的书籍List<Book>findByTagsContaining(Stringtag);--查询标题包含"Spring"的书......
  • JAVA下载安装配置基础
    JAVA下载安装配置基础JDK、JRE、JVMJDK:JavaDevelopmentKitJava开发者工具,他包含JRE和JVMJRE:JavaRuntimeEnvironmentJava运行时环境包含JVMJVM:JAVAVirtualMachineJave虚拟机下载配置JDK搜索下载JDK8(目前使用率较高的版本)安装JDK记住安装的路径进入高......
  • 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)
    问题分析intselectDeviceMonthRepairCount(StringdeviceType,Stringmonth);<selectid="selectDeviceMonthRepairCount"resultType="int">SELECTSUM(repair_count)FROMwarranty_recordsWHEREdevice_type=......
  • java代码规范
    Java代码规范规范类型规范要求命名规范-类名:大写字母开头,驼峰命名法。<br>-方法名、变量名、包名:小写字母开头,驼峰命名法。<br>-常量:全大写字母,下划线分隔单词。缩进和空格-使用4个空格进行缩进,不使用制表符。<br>-二元运算符前后应该加上空格,以增......
  • java代码评审检查表
    Java代码评审检查表编号检查项是否不适用BUG数代码行备注源文件1是否以UFT-8编码      2是否使用通配符导入      3import语句是否换行      ......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......