一、在项目开发中,经常会遇到像菜单式的页面,如下图
数据表结构一般像一个树形结构一样
对应的Model体
@Data //代替get、set方法
@ApiModel("知识园地视图")
public class ContentKnowledgeVO{
/***
* 主键id
*/
@ApiModelProperty("主键id")
private String knowledgeId;
/***
*类型名称
*/
@ApiModelProperty("类型名称")
private String knowledgeName;
/***
* 上级id
*/
@ApiModelProperty("上级id")
private String parentCode;
/***
* 类型内容
*/
@ApiModelProperty("类型内容")
private String knowledgeContext;
/**
* 默认显示状态为0
* 0是显示,1是不显示
*/
@ApiModelProperty("显示状态")
private Integer enabledState;
/***
* 实现递归的条件
*/
@ApiModelProperty("子节点列表")
private List<ContentKnowledgeVO> childContentList;
}
二、Stream流实现递归结构代码
@Override
public List<ContentKnowledgeVO> getContentKnowledgeList() {
//从数据库中查询出所有数据
List<ContentKnowledgeVO> contentKnowledgeList = contentKnowledgeMapper.getContentKnowledgeList();
//获取父节点,0表示父节点
List<ContentKnowledgeVO> collect = contentKnowledgeList.stream().filter(e -> e.getParentCode().equals("0")).map(e -> {
e.setChildContentList(getChildrens(e, contentKnowledgeList));
return e;
}).collect(Collectors.toList());
return collect;
}
/**
* 递归查询子节点
* @param root
* @param contentKnowledgeList
* @return
*/
private List<ContentKnowledgeVO> getChildrens(ContentKnowledgeVO root, List<ContentKnowledgeVO> contentKnowledgeList) {
List<ContentKnowledgeVO> childrenList = contentKnowledgeList.stream().filter(e -> Objects.equals(e.getParentCode(), root.getKnowledgeId())).map(
e -> {
e.setChildContentList(getChildrens(e, contentKnowledgeList));
return e;
}
).collect(Collectors.toList());
return childrenList;
}
注意:适用情况一般在一个数据表中,父节点与子节点内容一样
参考博客