Java工具类 - 将List转换为树状结构
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
*/
/**
* 上级字段名称
*/
private Function superColumn;
/**
* 当前比对字段
*/
private Function column;
/**
* 列表接收字段名
*/
private BiConsumer> children;
/**
* 数据列表
*/
private List list;
/**
* 数据解除关联性使用的对象
*/
private Supplier decoupling;
/**
* 私有化工具类
*/
private TreeModel() {
}
/**
* 初始化载入树状工具类
*
* @param list需要整合的数据列表
* @param superColumn 上级字段(对象::字段get方法)
* @param column本级字段(对象::字段get方法)
* @param children下级数据存储字段(对象::字段set方法)
* @return 树状工具类
*/
public static TreeModel load(List list, Function superColumn,
Function column, BiConsumer> children) {
TreeModel treeModel = new TreeModel<>();
treeModel.setSuperColumn(superColumn)
.setColumn(column)
.setChildren(children)
.setList(list);
return treeModel;
}
/**
* 获取树状数据(不解除原集合中对象与树状集合对象的关联)
*
* @param initValue 根数据
* @return 树状数据数据列表
*/
public List getTree(Object initValue) {
List 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 getTree(Object initValue, Supplier decoupling) {
this.setDecoupling(decoupling);
return tree(initValue);
}
/**
* 获取树状数据
*
* @param initValue 根数据
* @return 树状数据
*/
private List treeAll(Object initValue) {
if (list == null || list.size() < 1) {
return list;
}
List 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 tree(Object o) {
List 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 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 setSuperColumn(Function superColumn) {
if (superColumn == null) {
throw new NullPointerException("superColumn");
}
this.superColumn = superColumn;
return this;
}
private TreeModel setColumn(Function column) {
if (column == null) {
throw new NullPointerException("column");
}
this.column = column;
return this;
}
private TreeModel setChildren(BiConsumer> children) {
if (children == null) {
throw new NullPointerException("children");
}
this.children = children;
return this;
}
private void setList(List list) {
if (list == null || list.size() < 1) {
throw new NullPointerException("list");
}
this.list = list;
}
private void setDecoupling(Supplier decoupling) {
if (decoupling == null) {
throw new NullPointerException("decoupling");
}
this.decoupling = decoupling;
}
【Java工具类 - 将List转换为树状结构】}
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 为什么你的路演总会超时()
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 事件代理
- 孩子不是实现父母欲望的工具——林哈夫
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- thinkphp|thinkphp 3.2 如何调用第三方类库
- 使用composer自动加载类文件
- 一个健康的APP和健全的人格大体类似