Stream流递归查询树结构数据
最近发现了常规的递归查询效率慢的问题,需要优化,查询了一些资料,发现使用stream流时,无论是树结构的拼接还是排序,都会快很多。
机构对象:
/**
*机构对象
*/
public class orgTreeVo(){
private String id;// 树ID
private String name;// 名称
private String parentId;// 父ID
private String level;// 层级
private List<orgTreeVo> childrenList;//子集集合
...getter/setter
}
核心代码:
@Override
public List<orgTreeVo> getOrgTree(){
// 此处查询最终结果为:所有机构数据!至于使用的什么框架、或者各公司自己封装的框架,根据各自情况进行调整,最终结果不变即可
List<orgTreeVo> orgTreeDatas = sqlSessionTemplate.selectList("mapper地址");
// 此处的 -1 表示为最上级的机构id
return getChildren(orgTreeDatas ,"-1");
}
// 使用stream流查询出树结构的数据
private List<orgTreeVo> getChildren(List<orgTreeVo> orgTreeDatas ,String nodeParentId){
// 从上向下进行查询,并不适用从子集查询父级
return orgTreeDatas.stream()
.filter(l -> l.getParentId().equals(nodeParentId))
.peek(c ->c.setChildrenList(getChildren(orgTreeDatas ,c.getId)))
.collect(Collectors.toList());
}
在这里面还可以对数据进行排序:
先用name升序,再适用ID升序
private List<orgTreeVo> getChildren(List<orgTreeVo> orgTreeDatas ,String nodeParentId){
// 从上向下进行查询,并不适用从子集查询父级
return orgTreeDatas.stream()
.filter(l -> l.getParentId().equals(nodeParentId))
.peek(c ->c.setChildrenList(getChildren(orgTreeDatas ,c.getId)))
.sorted(Comparator.comparing(orgTreeDatas::getName))
.thenComparing(orgTreeDatas::getId)
.collect(Collectors.toList());
}
降序:
先根据name降序,再根据id降序,两种写法:
.sorted(Comparator.comparing(orgTreeDatas::getName).reversed())
.thenComparing(orgTreeDatas::getId,Comparator.reverseOrder())
使用stream流可以解决大批量数据的查询效率问题。