递归与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);

}
posted @   ProsperousEnding  阅读(231)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
  5. 5 所念皆星河 CMJ
  6. 6 所念皆星河-歌词版 房东的猫
  7. 7 卡农-钢琴版 dylanf
  8. 8 The truth that you leave Pianoboy高至豪
  9. 9 虹之间 米叔啊
原来你也在这里 - 周笔畅
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 姚谦

作曲 : 中島みゆき

编曲 : Terence Teo

制作人 : 朱敬然

请允许我尘埃落定

请允许我尘埃落定

用沉默埋葬了过去

满身风雨我从海上来

才隐居在这沙漠里

该隐瞒的事总清晰

千言万语只能无语

爱是天时地利的迷信

喔 原来你也在这里

啊 那一个人

是不是只存在梦境里

为什么我用尽全身力气

却换来半生回忆

若不是你渴望眼睛

若不是我救赎心情

在千山万水人海相遇

喔 原来你也在这里

请允许我尘埃落定

请允许我尘埃落定

用沉默埋葬了过去

满身风雨我从海上来

才隐居在这沙漠里

该隐瞒的事总清晰

千言万语只能无语

爱是天时地利的迷信

喔 原来你也在这里

啊 那一个人

是不是只存在梦境里

为什么我用尽全身力气

却换来半生回忆

若不是你渴望眼睛

若不是我救赎心情

在千山万水人海相遇

喔 原来你也在这里

啊 那一个人

啊 那一个人

是不是只存在梦境里

为什么我用尽全身力气

却换来半生回忆

若不是你渴望眼睛

若不是我救赎心情

在千山万水人海相遇

喔 原来你也在这里

该隐瞒的事总清晰

千言万语只能无语

爱是天时地利的迷信

喔 原来你也在这里

OT: AISARERU HANA AISAREXIU HANA

OT: AISARERU HANA AISAREXIU HANA

(中文版:原来你也在这里)

OP: Yamaha Music Publishing Inc

SP:百代音乐版权代理(北京)有限公司

配唱制作人:翁乙仁

点击右上角即可分享
微信分享提示