递归与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流转换的更多相关文章

  1. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  2. 在stream流和byte[]中查找(搜索)指定字符串

    在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的“ ...

  3. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  4. (六)jdk8学习心得之Stream流

    六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ...

  5. Java8的Stream流(一) --- 基础用法

    Java8中的Stream Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象. Stream的特性及优点: 无存储. Stream不是一种数据 ...

  6. node api 之:stream - 流

    stream 模块可以通过以下方式使用: const stream = require('stream'); 流可以是可读的.可写的.或者可读可写的. 所有的流都是 EventEmitter 的实例. ...

  7. 010-jdk1.8版本新特性二-Optional类,Stream流

    1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...

  8. Java之Stream流

    Stream流的初步学习 初次学习Stream流的学习笔记,学习之前先了解一下函数式接口 概述 API是一个程序向使用者提供的一些方法,通过这些方法就能实现某些功能.所以对于流API来 说,重点是怎么 ...

  9. Java中的文件和stream流的操作代码

    1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...

  10. JavaSE复习(七)Stream流和方法引用

    Stream流 全新的Stream概念,用于解决已有集合类库既有的弊端. 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们 ...

随机推荐

  1. 【Elasticsearch】ES选主流程分析

    Raft协议 Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群.Raft协议中有以下角色: Leader(领导者):集群中的领导者,负责管理集群. Candidate(候选者 ...

  2. HBuilder X之uniapp最适合的代码补全模板

    { // 注意:本文档仅支持单行注释,并且'//'前不能有任何非空字符!!! // // HBuilderX使用json扩展代码块,兼容vscode的代码块格式 // 本文档修改完毕,保存即可生效,无 ...

  3. thinkphp5.1打印SQL语句

    最近在写tp框架搭建的小玩具,有时候我们需要查看SQL语句.所以就诞生了这篇随笔,命令如下: $xxx=db('xxx')->where('x',xx)->select(); $sql=D ...

  4. 关于Elasticsearch使用java的说明

    从Elastic 7.0开始,我们可以不安装JAVA.安装包包含一个相匹配的JAVA版本在里面. Elasticsearch包含来自JDK维护者(GPLv2 + CE)的捆绑版OpenJDK. 要使用 ...

  5. Elasticsearch集群规模和容量规划的底层逻辑

    转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...

  6. 使用KubeOperator安装k8s集群后,节点主机yaml文件路径

    [root@k8s-develop-master-1 kubernetes]# cd /etc/kubernetes [root@k8s-develop-master-1 kubernetes]# l ...

  7. “kill -9”一时爽,秋后算账泪两行

    接受两个参数.第一个参数是pid,第二个参数是等待的秒数. #!/bin/bash # 接受两个参数.第一个参数是pid,第二个参数是等待的秒数. pid=$1 count=$2 n=0 if [ ! ...

  8. 洛谷P2865 [USACO06NOV]Roadblocks G(次短路)

    一个次短路的问题,可以套用dijkstra求最短路的方法,用dis[0][i]表示最短路:dis[1][i]表示次短路,优先队列中存有最短路和次短路,然后每次找到一条道路对他进行判断,更新最短或次短路 ...

  9. C++/python求哈希值(SHA256)

    发现一个很奇怪的现象: python语言求哈希值所用时间竟然比C++少: C++ code 1 #include "stdafx.h" 2 #include <windows ...

  10. EFCore (二)之 跟踪实体

    核心 SaveChanges() "已分离"和"未改变"的实体,SaveChanges()忽略: "已添加"的实体,SaveChanges( ...