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;
public class TreeUtils {
public static <T> List<T> buildTree(List<T> list, Function<T, Integer> fun, Function<T, Integer> fun2) {
return buildTree(list, fun, fun2, -1);
}
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;
@Data
public class BaseTree {
private List<BaseTree> children;
}
具体的实体类
import lombok.Data;
@Data
public class TreeDemo extends BaseTree{
private Integer id;
private Integer parentId;
}