话不多说,直接上代码
首先实体类,重点关注这种 childList 结构
@Data
public class BsOrg implements java.io.Serializable {
@ApiModelProperty("机构编码")
private String orgCode;
@ApiModelProperty("机构名称")
private String orgName;
@ApiModelProperty("父级机构编码")
private String parentCode;
@ApiModelProperty("子菜单")
private List<BsOrg> children;
}
for循环实现部门的树形结构的方法:
public List<BsOrg> findSOrgList() {
List<BsOrg> all = bsOrgDao.findAll();
List<BsOrg> orgList = new ArrayList<>();
Map<String, BsOrg> orgMap = new HashMap<>();
for (BsOrg org : all) {
org.setChildren(new ArrayList<BsOrg>());
orgMap.put(org.getOrgCode(), org);
}
for (BsOrg org : all) {
String parentCode = org.getParentCode();
if ("0".equals(parentCode)) {
orgList.add(org);
} else {
BsOrg parent = orgMap.get(org.getParentCode());
if (parent != null) {
parent.getChildren().add(org);
}
}
}
return orgList;
}
java8 Stream实现
/**
* @Description:查询机构结构
*
* @author zhangzhiqing
* @date 2022/3/24 10:32
*/
public List<BsOrg> findSOrgList() {
List<BsOrg> all = bsOrgDao.findAll();
//获取父节点
List<BsOrg> collect = all.stream().filter(m -> "0".equals(m.getParentCode())).map(
(m) -> {
m.setChildren(getChildrens(m, all));
return m;
}
).collect(Collectors.toList());
return collect;
}
/**
* 递归查询子节点
* @param root 根节点
* @param all 所有节点
* @return 根节点信息
*/
private List<BsOrg> getChildrens(BsOrg root, List<BsOrg> all) {
List<BsOrg> children = all.stream().filter(m -> {
return Objects.equals(m.getParentCode(), root.getOrgCode());
}).map(
(m) -> {
m.setChildren(getChildrens(m, all));
return m;
}
).collect(Collectors.toList());
return children;
}
返回的结构,因为实体我做了删减 粘贴的里面字段比较多,这种