1.树形实体类
@Data
public class SuperTree {
protected String id;
protected String pid;
protected List<? super SuperTree> children = new ArrayList<>();
}
2.树形子类
@Data
public class TypeTreeVo extends SuperTree {
/**
* 类型名称
*/
private String label;
}
3.工具类
public static <V extends SuperTree> List<V> getTree(@Nullable List<V> list) {
//返回的树
List<V> roots = new ArrayList<>();
//将数据添加到map
Map<String,V> map= new HashMap<>();
list.stream().forEach(tree -> map.put(tree.getId(),tree));
list.forEach(entity -> {
//1.判断是否存在父节点
V v = map.get(entity.getPid());
if(null == v){ //说明是顶级节点
roots.add(map.get(entity.getId()));
}else { //找到父节点添加,添加到父节点的children字段
//1.获取到父对象
V child = map.get(entity.getPid());
//2.将对象添加到父对象的children
child.getChildren().add(entity);
}
});
return roots;
}
4.调用
/**
* 获取类型
* @return
*/
@ApiOperation("获取树形资产类型")
@GetMapping("/tree")
public Result getList(){
//从数据库查询出所有数据
List<TypeTreeVo> list = assetsTypeService.getList();
//转为树形
List<TypeTreeVo> tree = TreeBuilder.getTree(list);
return Result.SUCCESS(tree);
}
5.总结
只需要继承SuperTree类。在从数据库查询出所有数据,在把list丢进工具类就行了