代码
public class BuildTree {
public static <T extends TreeParent> T getTree(T t, List<T> tList) {
return buildNode(t, tList);
}
public static <T extends TreeParent> List<T> getTree(List<T> tList) {
/**
* 1 获取集合中id
* 2 获取集合pid
* 3 过滤pid不在id集合中的对象
* 4 生成最终的循环root对象
* */
List<Long> idCollect = tList.stream().map(T::getTreeId).collect(Collectors.toList());
List<Long> pidCollect = tList.stream().map(T::getTreePid).collect(Collectors.toList());
List<Long> notContainsPidCollect = pidCollect.stream().filter(integer -> !idCollect.contains(integer)).collect(Collectors.toList());
List<T> rootCollect = tList.stream().filter(t -> notContainsPidCollect.contains(t.getTreePid())).collect(Collectors.toList());
List<T> returnList = new ArrayList<>();
for (T t : rootCollect) {
returnList.add(buildNode(t, tList));
}
return returnList;
}
private static <T extends TreeParent> T buildNode(T t, List<T> tList) {
for (T t1 : tList) {
if (t.getTreeId().equals(t1.getTreePid())) {
t.addChildren(t1);
if (!t1.getTreeId().equals(t.getTreeId())) {
buildNode(t1, tList);
}
}
}
return t;
}
public interface TreeParent<T> {
Long getTreeId();
Long getTreePid();
List<T> getChildren();
void addChildren(T t);
}
}
事例
基础对象
@Data
@Table("gl_resource")
public class GlResource {
@Id(autoIncrement = false)
@Column("resource_id")
private Long resourceId = null;
@Column("resource_name")
private String resourceName = null;
@Column("resource_path")
private String resourcePath = null;
@Column("resource_path_regx")
private String resourcePathRegx = null;
@Column("resource_path_method")
private String resourcePathMethod = null;
@Column("resource_state")
private Integer resourceState = null;
@Column("resource_pid")
private Long resourcePid = null;
@Column("resource_sort")
private Integer resourceSort = null;
@Column("create_time")
private Date createTime = null;
@Column("update_time")
private Date updateTime = null;
}
tree对象
@NoArgsConstructor
public class TreeResource extends GlResource implements BuildTree.TreeParent<TreeResource> {
List<TreeResource> children = new ArrayList<>();
public TreeResource(GlResource glResource) {
BeanUtils.copyProperties(glResource, this);
}
@Override
public Long getTreeId() {
return getResourceId();
}
@Override
public Long getTreePid() {
return super.getResourcePid();
}
@Override
public List<TreeResource> getChildren() {
return children;
}
@Override
public void addChildren(TreeResource treeResource) {
children.add(treeResource);
}
}
调用:
orm不必理会,最终传入tree集合对象即可。
List<TreeResource> treeResourceList = ormJdbcTemplate.query(queryResourceSql, new BeanPropertyRowMapper<>(GlResource.class)).stream().map(resource -> new TreeResource(resource)).collect(Collectors.toList());
return BuildTree.getTree(treeResourceList);