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);
}
}