写一个通用的TreeUtil,自关联表结构的树形构造



package com.ccsa.common.core.util;

import lombok.experimental.UtilityClass;
import org.springframework.lang.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@UtilityClass
public class TreeUtil {


    public  List treeList(List originalList, I rootId, Function getId, Function getPid,
                                      Function> getChildrenList, Function handleV) {
        return treeList(originalList, rootId, getId, getPid, getChildrenList, handleV, null);
    }

    public  List treeList(List originalList, I rootId, Function getId, Function getPid,
                                      Function> getChildrenList, Function handleV, @Nullable OtherHandle otherHandle) {
        return tree(originalList, rootId, getId, getPid, getChildrenList, handleV, otherHandle).entrySet().stream()
                .filter(i -> rootId.equals(i.getKey())).map(Map.Entry::getValue).collect(Collectors.toList());
    }

    public  Map tree(List originalList, I rootId, Function getId, Function getPid,
                                    Function> getChildrenList, Function handleV) {
        return tree(originalList, rootId, getId, getPid, getChildrenList, handleV, null);
    }

    /**
     * treeUtil
     *
     * @param originalList    原始列表
     * @param rootId          根结点
     * @param getId           获取id
     * @param getPid          获取pid
     * @param getChildrenList 获取子节点的list
     * @param handleV         处理Vo,这里要初始化好 childrenList
     * @param otherHandle     其他处理
     * @param              入参
     * @param              id类型
     * @param              出参
     * @return 结果树
     */
    public  Map tree(List originalList, I rootId, Function getId, Function getPid,
                                    Function> getChildrenList, Function handleV,
                                    @Nullable OtherHandle otherHandle) {
        //构建map
        Map resultMap = new LinkedHashMap<>();
        Map map = originalList.stream().collect(Collectors.toMap(getId, Function.identity()));
        //
        for (T t : originalList) {
            I pid = getPid.apply(t);
            I id = getId.apply(t);
            V v = resultMap.get(id);
            if (v == null){
               v = handleV.apply(t);
            }

            if (pid == rootId) {
                //判断顶层是否存在,不存在则创建,处理没有子项的顶层
                if (!resultMap.containsKey(id)) {
                    resultMap.put(id, v);
                }
                continue;
            }
            //获取父类,将自己添加到父类
            V parentV = resultMap.computeIfAbsent(pid, key -> handleV.apply(map.get(key)));
            //将自己加入结果map
            resultMap.putIfAbsent(id, v);
            //父节点的子节点列表
            List parentChildrenList = getChildrenList.apply(parentV);
            parentChildrenList.add(v);
            if (otherHandle != null) {
                otherHandle.accept(v, parentV, t, map, resultMap);
            }
        }
        return resultMap;
    }

    public interface OtherHandle {
        /**
         * 其他处理
         *
         * @param vo        vo
         * @param parentVo  父vo
         * @param t         原始参数
         * @param cacheMap  原始缓存
         * @param resultMap 结果集缓存
         */
        void accept(V vo, V parentVo, T t, Map cacheMap, Map resultMap);
    }
}