使用java流对数据获取父节点下的所有子节点
代码:
/**
* 获取第一级的元素
*/
public List<SysLibrary> libraryList(SysLibrary sysLibrary) {
List<SysLibrary> sysLibraries = sysLibraryMapper.libraryList(sysLibrary);
return sysLibraries.stream()
//过滤父id为0的分类
.filter(l -> l.getParentId() == 0)
//将上面的过滤后得到的分类list获取子分类进行封装,
//peek()是过程流,不会进行输出,只会对list中的每一元素都执行一次Consumer。
.peek(c -> c.setChildren(getChildren(sysLibraries, Long.valueOf(c.getLibraryId()))))
//按照id进行排序
.sorted(Comparator.comparingLong(SysLibrary::getLibraryId))
.collect(Collectors.toList());
}
/**
* 获取子分类
*
* @param sysLibraries
* @return
*/
public List<SysLibrary> getChildren(List<SysLibrary> sysLibraries, Long parentId) {
return sysLibraries.stream()
.filter(l -> l.getParentId().equals(parentId))
.peek(c -> c.setChildren(getChildren(sysLibraries, c.getLibraryId())))
.sorted(Comparator.comparingLong(SysLibrary::getLibraryId))
.collect(Collectors.toList());
}
@Data
public class SysLibrary {
/** 分类id */
private Long libraryId;
/** 网校id */
private Long schoolId;
/** 父id */
private Long parentId;
/** 分类名称 */
private String libraryName;
/** 分类类型 1 试题 2 试卷*/
private Integer libraryType;
/** 试题数量 */
private Integer qesCount;
/** 逻辑删除 0是存在 2是删除*/
private Integer delFlag;
private List<SysLibrary> children;
}
演示数据