用递归算法画递归树(递归与Stream流转换)
导读:递归与Stream流转换 今天写一个很久以前一直不太会的,今天花了大量的时间进行研究处理,现将代码解析于此...
递归与Stream流转换
今天写一个很久以前一直不太会的 ,今天花了大量的时间进行研究处理 ,现将代码解析于此
list转为类中一个属性为key,类实例为value的Map
Map<String, List<OrgTreeVo>> orgMap = orgList.stream().filter(h -> StringUtils.isNotEmpty(h.getParentId())).collect(Collectors.groupingBy(OrgTreeVo::getParentId));list单独取出对象中一个属性成为集合/数组
//成为集合 List<String> ids=list.stream().map(Person::getId).collect(Collectors.toList); //成为数组 Long names=list.stream().map(Person::getName).toArray(Long[]::new);遍历部门与人员难点:将所有部门递归后 ,如何将人放入部门中前端才可遍历处理
步骤:--在此只写service层代码
核心代码:
@Resource private OrgMapper orgMapper; @Resource private PersonMapper personMapper; /** * a.查询组织树 */ public List<TreeVo> queryOrgTree() { //1.查询所有组织 List<TreeVo> orgList = orgMapper.queryAllOrgList(); //塞key便于前端遍历树(可优化) orgList.stream().forEach(h->h.setKey(h.getId())); //2.查询所有有父级的组织 --查询时最好赋值type类型 eg:org方便以后操作时区分部门与人 Map<String, List<OrgTreeVo>> orgMap = orgList.stream().filter(h -> StringUtils.isNotEmpty(h.getParentId())).collect(Collectors.groupingBy(OrgTreeVo::getParentId)); //3.获得组织父级id--即(parentId) Set<String> parentIds = orgMap.keySet(); //4.获取所有根节点--即获取最高层部门 List<OrgTreeVo> orgRootList = orgList.stream().filter(h -> StringUtils.isEmpty(h.getParentId())).collect(Collectors.toList()); //调用构造树的方法 return recursiveTree(orgRootList, orgMap, parentIds); } /** * b.构造树 */ public List<OrgTreeVo> recursiveTree(List<OrgTreeVo> orgRootList, Map<String, List<OrgTreeVo>> orgMap, Set<String> parentIds) { //1.遍历根节点--即遍历高层(父级)部门 for (OrgTreeVo orgTreeVo : orgRootList) { //如果组织父级id包含了正在遍历中的组织的id if (parentIds.contains(orgTreeVo.getId())) { //2.将当前的组织Org对象赋值到父级的Children中 orgTreeVo.setChildren(orgMap.get(orgTreeVo.getId())); //3.查询当前组织下的人----查询时最好赋值type类型 eg:person方便以后操作时区分部门与人,返回类型与组织的返回类型相同(方便前端遍历处理) List<OrgTreeVo> users = personMapper.selectByOrgtId(orgTreeVo.getId()); //塞key便于前端遍历树(可优化) users.stream().forEach(h->h.setKey(h.getPersonId())); //4.将人也添加到组织的Children中 orgTreeVo.getChildren().addAll(users); //5.递归调用自己 recursiveTree(orgTreeVo.getChildren(), orgMap, parentIds); } } return orgRootList; }vo类:
/** * 人员I */ @Data public class OrgTreeVo { /** * 编码 */ private String key; /** * 节点主键id--即组织id */ private String id; /** * 节点父级主键id--即组织父级id */ private String parentId; /** * 节点名称--即组织名称 */ private String name; /** * 类型--可在查询时塞type eg:(person ,org) */ private String type; /** * 人id */ private String personId; /** * 人名 */ private String personName; /** * 人员所属组织id */ private String orgId; /** * 子集 //Google的Lists可用其他代替 */ private List<OrgTreeVo> children = Lists.newArrayListWithCapacity(8); }
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!