递归与Stream流转换
2024-09-08 18:28:06
递归与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);
}
最新文章
- reactjs学习之路
- java多线程学习
- eclipse使用tips-Toggle Mark Occurrences 颜色更改
- Linux平台下快速搭建FTP服务器
- mysql输入密码后闪退怎么办?
- eclipse运行mapreduce报错Permission denied
- app上传 需要的icon
- Trident内核中取验证码图片的几种方法
- linux 开通ftp账号
- 随记一个C的时间加减
- 14.LINUX-platform机制实现驱动层分离(详解)
- [Swift]LeetCode390. 消除游戏 | Elimination Game
- vscode中php断点调试方法!
- php解析文本文件呈现在表格上
- 剑指offer——python【第56题】删除链表中的重复节点
- 响应式 Web 设计指南「实践篇」
- SqlServer function 函数
- UML箭头
- centos7 安装LNMP(php7)之 nginx php-fpm yum安装以及配置文件修改
- java基础(1-50)-------->;超级简单,不信你不会!!!
热门文章
- Openstack Neutron:二层技术和实现
- 6、Arrays类
- (数据科学学习手札143)为geopandas添加gdb文件写出功能
- 记一个nginx server_name配置多个时的坑
- 使用python读取京东pdf发票信息导出到excel表格中
- 4_爬NMPA药监总局_动态加载_传ID
- a += 20 和 a = a+20前者不报错,后者报错的原因
- 关于使用git传输文件到GitHub
- Qemu/Limbo/KVM镜像 Ubuntu 22.04 精简版,可运行Windows软件,内存占用不到200M
- css过渡样式