Stream流递归查询树结构数据,解决常规递归查询效率问题

                      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流可以解决大批量数据的查询效率问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值