import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**

  • @program: myUtil
  • @description: 工具类 - 树状构造生成
  • @author: syf
  • @create: 2021-06-15 10:38
    */

public class TreeModel<T> {

/** * 下级字段名称 */private Function<T, ?> superColumn;/** * 以后比对字段 */private Function<T, ?> column;/** * 列表接管字段名 */private BiConsumer<T, List<T>> children;/** * 数据列表 */private List<T> list;/** * 数据解除关联性应用的对象 */private Supplier<T> decoupling;/** * 私有化工具类 */private TreeModel() {}/** * 初始化载入树状工具类 * * @param list        须要整合的数据列表 * @param superColumn 下级字段(对象::字段get办法) * @param column      本级字段(对象::字段get办法) * @param children    上级数据存储字段(对象::字段set办法) * @return 树状工具类 */public static <R> TreeModel<R> load(List<R> list, Function<R, ?> superColumn,                                    Function<R, ?> column, BiConsumer<R, List<R>> children) {    TreeModel<R> treeModel = new TreeModel<>();    treeModel.setSuperColumn(superColumn)            .setColumn(column)            .setChildren(children)            .setList(list);    return treeModel;}/** * 获取树状数据(不解除原汇合中对象与树状汇合对象的关联) * * @param initValue 根数据 * @return 树状数据数据列表 */public List<T> getTree(Object initValue) {    List<T> tree = treeAll(initValue);    if (tree != null && tree.size() > 0) {        return tree.stream().filter(ls -> initValue.equals(superColumn.apply(ls))).collect(Collectors.toList());    }    return tree;}/** * 获取树状数据(解除原汇合中对象与树状汇合对象的关联) * * @param initValue  根数据 * @param decoupling 解除关联对象(对象::new) * @return 树状数据数据列表 */public List<T> getTree(Object initValue, Supplier<T> decoupling) {    this.setDecoupling(decoupling);    return tree(initValue);}/** * 获取树状数据 * * @param initValue 根数据 * @return 树状数据 */private List<T> treeAll(Object initValue) {    if (list == null || list.size() < 1) {        return list;    }    List<T> collect = list.stream().filter(f -> initValue.equals(superColumn.apply(f))).collect(Collectors.toList());    if (collect.size() < 1) {        return null;    }    collect.forEach(c -> children.accept(c, treeAll(column.apply(c))));    return collect;}private List<T> tree(Object o) {    List<T> childrenList = new ArrayList<>();    if(o == null){        return childrenList;    }    for (T entity : list) {        if (o.equals(superColumn.apply(entity))) {            T now = decoupling.get();            copy(entity, now);            childrenList.add(now);        }    }    for (T cs : childrenList) {        children.accept(cs, tree(column.apply(cs)));    }    return childrenList;}/** * 将source中的属性赋值给target * @param source    数据起源类 * @param target    数据接管类 */private void copy(T source, T target) {    if (source == null) {        throw new NullPointerException("dataSource");    }    if (target == null) {        target = decoupling.get();    }    Field[] sourceFields = source.getClass().getDeclaredFields();    Field[] targetFields =[期货](https://www.gendan5.com/p/2021-06-11/248014.html) target.getClass().getDeclaredFields();    Map<String, Object> sourceMap = new HashMap<>(sourceFields.length);    try {        for (Field field : sourceFields) {            if (Modifier.isFinal(field.getModifiers())) {                continue;            }            field.setAccessible(true);            sourceMap.put(field.getName(), field.get(source));        }        for (Field field : targetFields) {            Object o = sourceMap.get(field.getName());            if (o == null) {                continue;            }            field.setAccessible(true);            field.set(target, o);        }    } catch (IllegalAccessException e) {        e.printStackTrace();    }}private TreeModel<T> setSuperColumn(Function<T, ?> superColumn) {    if (superColumn == null) {        throw new NullPointerException("superColumn");    }    this.superColumn = superColumn;    return this;}private TreeModel<T> setColumn(Function<T, ?> column) {    if (column == null) {        throw new NullPointerException("column");    }    this.column = column;    return this;}private TreeModel<T> setChildren(BiConsumer<T, List<T>> children) {    if (children == null) {        throw new NullPointerException("children");    }    this.children = children;    return this;}private void setList(List<T> list) {    if (list == null || list.size() < 1) {        throw new NullPointerException("list");    }    this.list = list;}private void setDecoupling(Supplier<T> decoupling) {    if (decoupling == null) {        throw new NullPointerException("decoupling");    }    this.decoupling = decoupling;}

}