数组类型 转 树 的工具类

该博客介绍了如何使用Java的Stream API和反射机制将列表数据转换为树形结构,主要涉及`TreeUtils`类的`buildTree`方法,以及一个基础类`BaseTree`和具体实体类`TreeDemo`,包含`id`和`parentId`字段,适用于构建层级关系的数据结构。
摘要由CSDN通过智能技术生成

import org.springframework.util.CollectionUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author 张林
 * @version 1.0
 * @date 2021/12/1 5:35 下午
 */
public class TreeUtils {

    /**
     *
     * @param list 数据
     * @param fun 对应父级的 id
     * @param fun2 标识 父级 的 字段
     * @param <T> 类范型
     * @return 树级结构
     */
    public static <T> List<T> buildTree(List<T> list, Function<T, Integer> fun, Function<T, Integer> fun2) {
        return buildTree(list, fun, fun2, -1);
    }

    /**
     *
     * @param list 数据
     * @param fun 对应父级的 id
     * @param fun2 标识 父级 的 字段
     * @param sorce 最上级parentId 的值
     * @param <T> 类范型
     * @return 树级结构
     */
    public static <T> List<T> buildTree(List<T> list, Function<T, Integer> fun, Function<T, Integer> fun2, Integer sorce) {
        if (CollectionUtils.isEmpty(list)) {
            return new ArrayList<>(0);
        }
        Map<Integer, List<T>> treeMap = list.stream().collect(Collectors.groupingBy(fun2));
        List<T> parents = list.stream().filter(x -> Objects.equals(sorce, fun2.apply(x))).collect(Collectors.toList());
        return getChildren(parents, fun, treeMap);
    }

    private static <T> List<T> getChildren(List<T> list, Function<T, Integer> fun, Map<Integer, List<T>> treeMap) {
        for (T x : list) {
            Method setChildren = null;
            try {
                setChildren = x.getClass().getMethod("setChildren", List.class);
            } catch (NoSuchMethodException e) {
                System.out.println("未找到 setChildren 方法");
            }
            setChildren.setAccessible(true);
            List<T> ts = treeMap.get(fun.apply(x));
            if (Objects.isNull(ts)) {
                continue;
            }
            try {
                setChildren.invoke(x, getChildren(ts, fun, treeMap));
            } catch (IllegalAccessException | InvocationTargetException e) {
                System.out.println("未知异常");
            }
        }
        return list;
    }
}

一个基础类, 主要是限制 工具类中的 (setChildren) 方法


import lombok.Data;

import java.util.List;

/**
 * @author 张林
 * @version 1.0
 * @date 2021/12/1 7:14 下午
 */
@Data
public class BaseTree {

    private List<BaseTree> children;
}

具体的实体类


import lombok.Data;

/**
 * @author 张林
 * @version 1.0
 * @date 2021/12/1 6:02 下午
 */
@Data
public class TreeDemo extends BaseTree{

    private Integer id;
    private Integer parentId;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值