开云成为国际米兰亚洲区官方合作伙伴

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

今天写一个很久以前一直不太会的,今天花了大量的时间进行研究处理,现将代码解析于此 同题参见

list转为类中一个属性为key,类实例为value的Map

Map> orgMap = orgList.stream().filter(h -> StringUtils.isNotEmpty(h.getParentId())).collect(Collectors.groupingBy(OrgTreeVo::getParentId));

list单独取出对象中一个属性成为集合/数组

//成为集合
List ids=list.stream().map(Person::getId).collect(Collectors.toList); //成为数组
Long names=list.stream().map(Person::getName).toArray(Long[]::new);

遍历部门与人员难点:将所有部门递归后,如何将人放入部门中前端才可遍历处理 对照阅读

核心代码:

 @Resource
private OrgMapper orgMapper; @Resource
private PersonMapper personMapper;
/**
* a.查询组织树
*/
public List queryOrgTree() {
//1.查询所有组织
List orgList = orgMapper.queryAllOrgList();
//塞key便于前端遍历树(可优化)
orgList.stream().forEach(h->h.setKey(h.getId()));
//2.查询所有有父级的组织 --查询时最好赋值type类型 eg:org方便以后操作时区分部门与人
Map> orgMap = orgList.stream().filter(h -> StringUtils.isNotEmpty(h.getParentId())).collect(Collectors.groupingBy(OrgTreeVo::getParentId));
//3.获得组织父级id--即(parentId)
Set parentIds = orgMap.keySet();
//4.获取所有根节点--即获取最高层部门
List orgRootList = orgList.stream().filter(h -> StringUtils.isEmpty(h.getParentId())).collect(Collectors.toList());
//调用构造树的方法
return recursiveTree(orgRootList, orgMap, parentIds);
} /**
* b.构造树
*/
public List recursiveTree(List orgRootList, Map> orgMap, Set 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 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 children = Lists.newArrayListWithCapacity(8); }

你可能想看:

网页报错Message: date: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone s 相关阅读

实际上,从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0...

继续阅读

若需了解「开云成为国际米兰亚洲区官方合作伙伴」的上下文,可结合站内栏目与相关篇目交叉阅读。

栏目用于追新,文内链接用于对照细节。两者配合可减少漏读与重复检索。

继续浏览时优先选择同栏目或相近主题,避免被站外镜像带偏。

站点导览

遍历 · string · wiki · 科技

页面按栏目组织。可先看导读,再进入相关篇目或返回列表。