递归与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. gem5使用记录,gem5入门学习和环境配置。

    工作需要,对gem5有点兴趣,准备自己研究一下,gem5新手刚开始入门学习,主要参考了网上其他前人的文章和官方说明. 目前网上的前人文章有部分有点太早了,稍显过时,我结合自己的经历来整理一下流程. g ...

  2. IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思

    IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思 IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址 ...

  3. 璞华HawkEye平台助力乳品行业巨头在数字化转型中领“鲜”一步!

    中国乳制品的市场规模接近4,000亿.在今天,产业数字化正在帮助这个传统产业实现更高质量的发展. 乳品行业现状 随着乳品行业规模扩大,各工厂引进大量的专用设备,设备故障也随之增多.设备的突发故障极易造 ...

  4. Python数据科学手册-Pandas:数值运算方法

    Numpy 的基本能力之一是快速对每个元素进行运算 Pandas 继承了Numpy的功能,也实现了一些高效技巧. 对于1元运算,(函数,三角函数)保留索引和列标签 对于2元运算,(加法,乘法),Pan ...

  5. Kibana可视化数据(Visualize)

    在侧边导航栏点击 Visualize 开始视化您的数据. Visualize 工具能让您通过多种方式浏览您的数据.例如:我们使用饼图这个重要的可视化控件来查看银行账户样本数据中的账户余额.点击屏幕中间 ...

  6. shell下cat EOF中变量$处理

    在使用cat EOF中出现$变量通常会直接被执行,显示执行的结果.若想保持$变量不变需要使用 \ 符进行注释 [root@localhost ~]# cat >> aa.txt <& ...

  7. kubernetes 查看pod 的容器日志

    1.pod若处于运行状态,则通过kubectl logs 即可 # 查看指定pod的日志 kubectl logs <pod_name> kubectl logs -f <pod_n ...

  8. Linux常用基础指令

    Linux常用指令 一.基础命令 whoami查看当前用户 pwd查看当前所在位置 ls 查看当前文件夹的内容 ls -l或ll显示详细内容 cd 绝对路径:从根目录开始的路径 cd / 文件夹 返回 ...

  9. 关于VirtualBox在新建虚拟机时-选择操作系统类型后没有64位的版本选项

    今天笔者准备使用VirtualBox安装一台windows的虚拟时,在选项操作系统类型为Microsoft Windows后 发现下面的版本选择中,没有之前看到的64位选择,全是32位的,但实际昨天都 ...

  10. 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor

    一.前言 小编最近在项目里看到有的同事大神用到了Lombok中的一个@RequiredArgsConstructor,带着好奇发现这个东西就是简化了一些@Autowired注解,想想如果一个Servi ...