文章介绍
本文将数据list转成树形结构数据。
必要条件:实体类结构必须有基本树形数据结构必要字段 例如:节点id字段、父节点id字段、子 节点集合字段。
自定义注解
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 通过注解构建实体类树形数据结构
*
* 只需在实体类中 节点字段、父节点字段、子节点集合字段 加上本注解,并填充 type属性值即可
* 节点字段: 支持类型 String、Long 、int 、Integer
* 父节点字段: 支持类型 String、Long 、int 、Integer
* 子集合字段: 支持类型 List<实体类>、List<Object>
*/
@Target(value= {
ElementType.FIELD})
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
public @interface TreeElement {
/**
* 字段类型 引用 TreeColumnType 中的常量
* @return
*/
String type() default "";
}
使用到的常量接口
/**
* @TreeElement注解type属性 标注值
*/
public interface TreeColumnType {
/**
* 节点id
*/
String NODE_ID = "NODE_ID";
/**
* 父节点id
*/
String PARENT_ID = "PARENT_ID";
/**
* 子节点集合
*/
String CHILDREN_ARRAY = "CHILDREN_ARRAY";
}
树形数据构建工具类
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TreeUtils {
/**
* 将列表转换为列表树/Convert List to List Tree
* @param trees 生成树形结构数据源
* @param boot 子集合无数据时 boot等于true返回null,boot等于false返回空数组
* @param clas 树形数据结构对象 即 @TreeElement 注解的使用类
* @param maxDeep 最大递归深度 为null则不限制
* @return result
* @throws IllegalAccessException result
*/
public static <T> List<T> ListToTree(List<T> trees,boolean boot,Integer maxDeep,Class<T> clas) throws IllegalAccessException, NoSuchFieldException {
HashMap<String,String> keys = findTreeElement(clas);
List<Object> ids = findColumnValues(trees,keys.get(TreeColumnType.NODE_ID));
List<T> rootList = new ArrayList<T>();
HashMap<