看了下hutool中的treeUtil,由于自定义的实体类转的时候,需要自定义config中的每一个字段,这会很慢,其次也很繁琐,然后发现一个更好的方法,分享一下
一共分两步: 第一步,定义一个TreeNode抽象,或者接口,作用是,一会儿在转tree的时候要用的属性方法,在此定义好,然后实体类去继承/实现
第二步,通过一个方法,获取每个元素的相应属性方法,将list集合,转为tree结构
1 TreeNode 根据每个类的具体需要去自定义
public interface TreeNode<T> {
String getId();
String getParentId();
Integer getDepth();
List<T> getChildren();
void setChildren(List<T> children);
}
2 实体类 ,去继承/实现 TreeNode中定义的方法(正常来说不用实现,仅仅是实体类属性的get/set)
@Data
public class BasicArea implements TreeNode<BasicArea>{
@NotBlank(groups={AreaValid.update.class})
private String id;
/**
* 区域名称
*/
private String name;
/**
* 区域码
*/
private String code;
/**
* 区域备注
*/
private String remark;
/**
* 父级区域id
*/
@NotNull(message = "不能为null")
private String parentId;
/**
* 所有父级区域id
*/
@Min(value=3,message = "长度最小值为3")
@Max(value=30,message = "长度最大值为30")
private String path;
/**
* 区域层级
*/
private Integer depth;
/**
* 扩展属性
*/
private String extend;
/**
* 排序号
*/
private Integer sort;
/**
* 删除标识【0未删除 1删除】
*/
private Boolean deleteStatus;
/**
* 创建人
*/
private String createUser;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改人
*/
private String updateUser;
/**
* 修改时间
*/
private Date updateTime;
/**
* 预留属性1
*/
private String column1;
/**
* 预留属性2
*/
private String column2;
/**
* 预留属性3
*/
private String column3;
/**
* 预留属性4
*/
private String column4;
/**
* 预留属性5
*/
private String column5;
List<BasicArea> children;
public BasicArea(String id, String parentId, int depth) {
this.id = id;
this.parentId = parentId;
this.depth = depth;
}
}
3 写个方法,去转换 TreeUtil
public class TreeUtil {
// 将集合转为树
public static <T extends TreeNode<T>> List<T> toTree(Collection<T> list) {
List<T> result = CollectionUtil.newArrayList();
Map<String, T> map = CollectionUtil.newHashMap();
for (T t : list) {
String id = t.getId();
String parentId = t.getParentId();
Integer depth = t.getDepth();
if (depth == null || depth == 0 || parentId == null || !map.containsKey(parentId)) {
result.add(t);
} else {
T parent = map.get(parentId);
List<T> children = parent.getChildren();
if (CollectionUtil.isEmpty(children)) {
children = CollectionUtil.newArrayList();
}
children.add(t);
parent.setChildren(children);
}
map.put(id, t);
}
return result;
}
// 测试方法
public static void main(String[] args) {
List<BasicArea> result = CollectionUtil.newArrayList();
result.add(new BasicArea("0",null,0));
result.add(new BasicArea("1","0",1));
result.add(new BasicArea("2","1",2));
result.add(new BasicArea("3","2",3));
result.add(new BasicArea("4","0",1));
List<BasicArea> basicAreas = toTree(result);
System.out.println(JSONUtil.toJsonStr(basicAreas));
}
}