使用Hutool工具中的TreeUtil进行配置实现树形结构
maven pom
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.6</version>
</dependency>
// 1.查数据
List<Menu> all = new ArrayList<>();
// 2.配置,可以不用配置,使用默认 TreeNodeConfig.DEFAULT_CONFIG
TreeNodeConfig config = new TreeNodeConfig();
//config.setIdKey("id");//默认为id可以不设置
//config.setParentIdKey("parentId");//默认为parentId可以不设置
//config.setDeep(4);//最大递归深度
config.setWeightKey("priority");//排序字段
// 3.转树,Tree<>里面泛型为id的类型
List<Tree<Long>> build = TreeUtil.build(all, 0L, config, (object, tree) -> {
// 也可以使用 tree.setId(object.getId());等一些默认值
tree.setId(object.getId())
.setParentId(object.getParentId())
.setName(object.getName())
.putExtra("icon", object.getIcon())
.putExtra("url", object.getUrl())
.putExtra("priority", object.getPriority())
.putExtra("type", object.getType());
});
为了字段名和配置的松耦合,引入如下工具类
字段名工具类
/**
* 使Function获取序列化能力
*
*/
@FunctionalInterface
public interface SerializableFunction<T, R> extends Function<T, R>, Serializable {
}
/**
* 获取某个实体类的字段名称
*
*/
public class ColumnUtil {
public static <T> String getName(SerializableFunction<T, ?> fn) {
// 从function取出序列化方法
Method writeReplaceMethod;
try {
writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
// 从序列化方法取出序列化的lambda信息
boolean isAccessible = writeReplaceMethod.isAccessible();
writeReplaceMethod.setAccessible(true);
SerializedLambda serializedLambda;
try {
serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
writeReplaceMethod.setAccessible(isAccessible);
// 从lambda信息取出method、field、class等
String fieldName = serializedLambda.getImplMethodName().substring("get".length());
fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase());
return fieldName;
}
}
// 用法
String masterName= ColumnUtils.getName(ScheMaster::getMasterName);//得到对应的字段名
实现案例
// 1.查数据
List<ScheMaster> list = iScheMasterService.list(lqw);
//转换为树结构
//配置
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey(ColumnUtils.getName(ScheMaster::getMasterId));//id
config.setParentIdKey(ColumnUtils.getName(ScheMaster::getParentId));//父级id
config.setChildrenKey(ColumnUtils.getName(ScheMaster::getChildren));//子节点
//转换
List<Tree<Integer>> build = TreeUtil.build(list, null, config, ((object, treeNode) -> {
treeNode.setId(object.getMasterId().intValue());//id
treeNode.setParentId(object.getParentId() != null?object.getParentId().intValue():null);//父id
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getMasterName), object.getMasterName());//任务名称
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getLevel), object.getLevel());//层级
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanStartTime), DateUtil.formatDate(object.getPlanStartTime()));//计划开始时间
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getRealStartTime), DateUtil.formatDate(object.getRealStartTime()));//实际开始时间
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanFinishTime), DateUtil.formatDate(object.getPlanFinishTime()));//计划完成时间
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getRealFinishTime), DateUtil.formatDate(object.getRealFinishTime()));//实际完成时间
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanDays), object.getPlanDays());//计划工期
treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPercentageComplete), object.getPercentageComplete());//百分比
}));