1、Java递归将List数据转换为Tree结构数据
https://blog.csdn.net/yuan_xiaohou/article/details/82461892?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_v2~rank_aggregation-1-82461892.pc_agg_rank_aggregation&utm_term=Java+%E5%B0%86list%E8%BD%AC%E6%8D%A2%E4%B8%BAtree&spm=1000.2123.3001.4430
2、java8使用stream()转化
https://blog.csdn.net/weixin_33725126/article/details/93244840
3、递归组装
https://blog.csdn.net/xcymorningsun/article/details/79254819
4、java8.stream().map()
// 调用转化的方法tree2List(menuPermissions,0L);// 递归***list转化成tree的递归方法!!!privateList<MenuPermission>tree2List(List<MenuPermission> menus,Long parentId){return menus.stream().map(l->{// 如果当前节点是parentId的一个孩子Aif(parentId.equals(l.getParentId())){// 获取孩子A的所有孩子As找出来,并标记到A的children list中存起来List<MenuPermission> cNode=treeList(menus, l.getId());
l.setChildren(cNode);// 遍历list当前的节点i,设置完成该节点i的所有children之后,就该返回了;// 返回也就是:继续在menus列表中找下一个结点的所有childrenreturn l;}returnnull;}).filter(Objects::nonNull).sorted(Comparator.comparing(MenuPermission::getSort,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());}
// 加载菜单树(递归方法的调用)publicList<MenuPermission>loadMenu(JwtUser jwtUser){/* 获取list */// 获取该用户有权限访问的菜单列表(直接从数据库中拿到的)Set<OdiMenu> menus=newHashSet<>();if(!CollectionUtils.isEmpty(jwtUser.getRoles())){for(OdiRole l: jwtUser.getRoles()){if(DefaultRoleEnmu.SUPER_ADMIN.name().equals(l.getCode())){List<OdiMenu> odiMenus= odiMenuMapper.queryAll();
menus.addAll(odiMenus);}else{List<OdiMenu> odiMenus= odiMenuMapper.queryUserMenu(l.getId());
menus.addAll(odiMenus);}}}/* 转化成tree list */// 使用list().stream().map(...).collect(Collectors.toList())得到权限树 treeListif(!CollectionUtils.isEmpty(menus)){// 1. 初始化菜单权限对象也是一个listList<MenuPermission> menuPermissions= menus.stream().map(l->{MenuPermission menuPermission=newMenuPermission();BeanUtils.copyProperties(l, menuPermission);
menuPermission.setLevel(Integer.valueOf(l.getLevel()));
menuPermission.setSort(Integer.valueOf(l.getSort()));return menuPermission;}).collect(Collectors.toList());// 2. 把list转化成tree的数据结构!!!returntree2List(menuPermissions,0L);}returnnull;}
5、生成指标树
返回的之后一个vo对象 |不是list对象
/**
* 生成量表中的指标树
* @param top 顶层指标
* @param list 所有指标列表(数据库中查出来的)
* @return
*/publicDiagnosisMetricVosetChild(DiagnosisMetricVo top,List<DiagnosisMetric> list){// 出口if(list.size()==0){return top;}// 设置子节点List<DiagnosisMetricVo> childs=getChilds(top, list);
top.setChildList(childs);// 遍历子节点 并为之设置子节点for(DiagnosisMetricVo child: childs){setChild(child, list);}return top;}/**
* 获取子指标
* @param top
* @param list
* @return
*/privateList<DiagnosisMetricVo>getChilds(DiagnosisMetricVo top,List<DiagnosisMetric> list){// 筛选子指标List<DiagnosisMetric> childs= list.stream().filter(a->{return top.getId().equals(a.getParentId());}).collect(Collectors.toList());// 转成voList<DiagnosisMetricVo> vos= childs.stream().map(a->{DiagnosisMetricVo mvo=newDiagnosisMetricVo();BeanUtils.copyProperties(a, mvo);return mvo;}).collect(Collectors.toList());return vos;}
vo对象(特别注意最后的private List<DiagnosisMetricVo> childList 为子指标列表)
@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassDiagnosisMetricVoimplementsSerializable{/**
* 主键
*/privateString id;/**
* 指标名称
*/privateString name;/**
* 父节点Id
* parentId=top 时为顶级节点
*/privateString parentId;/**
* 子节点列表
*/privateList<DiagnosisMetricVo> childList;}
递归删除表中的记录
privatevoiddelete(String scaleId,String metricId){// 删除中间表记录
diagnosisScaleMetricMapper.deleteByScaleAndMetricId(scaleId, metricId);// 获取当前指标的子指标List<DiagnosisScaleMetric> diagnosisScaleMetrics= diagnosisScaleMetricMapper.getChildrenByMetricId(scaleId, metricId);// 出口指标数为0if(diagnosisScaleMetrics.size()==0){return;}// 删除子指标对应的记录
diagnosisScaleMetrics.forEach(sm->{delete(scaleId, sm.getMetricId());});}