不使用递归形成组织树
组织结构一般是树形结构,很多情况下,会使用递归的方式来形成树形结构,其实对于组织这种数据量不大的数据来说,可以借助Map这种方式形成树形结构。
比如有如下这个组织表,有父ID,有自己的组织ID,
CREATE TABLE `zbh_custom_org` (
`org_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '组织Id',
`top_org_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '最上层组织ID',
`parent_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '父组织Id',
`custom_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '客户Id',
`org_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '组织名称',
PRIMARY KEY (`org_id`) USING BTREE
)
第一步将所有符合条件的组织查询出来,
List<ZbhCustomOrg> orgs = this.findOrgListInner(params);
第二步是映射到另一个实体类中,这个实体类有一个List<TreeOrgVO> childrenList 存放子组织,
@Data
@ApiModel(value = "组织树形数据")
public class TreeOrgVO {
@ApiModelProperty(value = "组织Id")
private String orgId;
@ApiModelProperty(value = "最上层组织Id")
private String topOrgId;
@ApiModelProperty(value = "父组织Id")
private String parentId;
@ApiModelProperty(value = "客户Id")
private String customId;
@ApiModelProperty(value = "组织名称")
private String orgName;
@ApiModelProperty(value = "下级组织列表")
private List<TreeOrgVO> childrenList;
}
将数据映射到Map中,
Map<String, TreeOrgVO> map = orgs.stream() // 转换为 Stream
.collect(Collectors.toMap(new Function<ZbhCustomOrg, String>() {
@Override
public String apply(ZbhCustomOrg treeOrgVO) {
return treeOrgVO.getOrgId();
}
}, new Function<ZbhCustomOrg, TreeOrgVO>() {
@Override
public TreeOrgVO apply(ZbhCustomOrg obj) {
TreeOrgVO treeOrgVO = new TreeOrgVO();
BeanUtils.copyProperties(obj,treeOrgVO);
treeOrgVO.setChildrenList(new ArrayList<>());
return treeOrgVO;
}
}));
第三步,不断的从Map中获取数据,形成组织树,由于Java对List是指向型,也可以理解为指针类型,所以下面方式是可行的,
//需要从Map中移除的orgId
Set<String> removeOrgIdSet = new HashSet<>();
//组装成树形结构
for (ZbhCustomOrg allDataRightOrg : orgs) {
String orgId = allDataRightOrg.getOrgId();
//顶级组织的parentId肯定是没有存在表中的
String parentId = allDataRightOrg.getParentId();
TreeOrgVO treeOrgVO = map.get(parentId);
TreeOrgVO child = map.get(orgId);
if(treeOrgVO==null||child==null) continue;
removeOrgIdSet.add(orgId);
treeOrgVO.getChildrenList().add(child);
}
最后一步删除Map中其他非顶级组织,
for (String s : removeOrgIdSet) {
map.remove(s);
}