递归与Stream流转换(递归中static)

  本篇文章为你整理了递归与Stream流转换(递归中static)的详细内容,包含有递归 stackoverflow 递归中static settimeout 递归 递归list 递归与Stream流转换,希望能帮助你了解 递归与Stream流转换。

  目录递归与Stream流转换list转为类中一个属性为key,类实例为value的Maplist单独取出对象中一个属性成为集合/数组步骤:--在此只写service层代码

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

  

 

  以上就是递归与Stream流转换(递归中static)的详细内容,想要了解更多 递归与Stream流转换的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: