实体-结果对象
-
/**
* @Author: Yolo
* @Date: 2023/06/02/10:21
* @Description:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FileEntity {
/**
* 文件id
*/
private Long id;
/**
* 文件显示名称
*/
private String fileName;
/**
* 父文件id
*/
private Long parentId;
}
-
/**
* @Author: Yolo
* @Date: 2023/06/02/10:06
* @Description:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FileVO {
/**
* 文件id
*/
private Long id;
/**
* 文件显示名称
*/
private String fileName;
/**
* 父文件id
*/
private Long parentId;
/**
* 子节点
*/
private List<FileVO> children;
/**
*拼装树节点
*/
public static FileVO assembleFileTreeNode(FileEntity fileEntity){
return FileVO.builder()
.id(fileEntity.getId())
.fileName(fileEntity.getFileName())
.parentId(fileEntity.getParentId())
.children(Lists.newArrayList())
.build();
}
}
方法1
- 根据父节点进行分组
- 设置孩子节点
- 过滤其它节点
-
public List<FileVO> assembleFileTree(List<FileEntity> fileEntityList) {
if (CollUtil.isEmpty(fileEntityList)) {
return Lists.newArrayList();
}
List<FileVO> fileVOList = fileEntityList.stream().map(FileVO::assembleFileTreeNode).collect(Collectors.toList());
//按父节点分组
Map<Long, List<FileVO>> fileGroup = fileVOList.stream().collect(Collectors.groupingBy(FileVO::getParentId));
//添加孩子
fileVOList.stream().forEach(node -> {
List<FileVO> children = fileGroup.get(node.getId());
if (CollUtil.isNotEmpty(children)) {
node.setChildren(children);
}
});
//过滤返回 ZERO_LONG = 0L,代表-根节点
return fileVOList.stream().filter(node -> Objects.equals(ZERO_LONG, node.getParentId())).collect(Collectors.toList());
}
方法2 - 递归
public static List<FileVO> assembleFileTree2(List<FileEntity> fileEntityList) {
if (CollUtil.isEmpty(fileEntityList)) return Lists.newArrayList();
List<FileVO> fileVOList = fileEntityList.stream().map(FileVO::assembleFileTreeNode).collect(Collectors.toList());
return fileVOList.stream().filter(node ->Objects.equals(ZERO_LONG, node.getParentId()))
.peek(node ->node.setChildren(getChildrenList(node,fileVOList)))
.collect(Collectors.toList());
}
/**
* 获取孩子节点
* @param fileVO
* @param list
* @return
*/
public static List<FileVO> getChildrenList(FileVO fileVO,List<FileVO> list){
return list.stream().filter(node -> Objects.equals(node.getParentId(),fileVO.getId()))
.peek(node -> node.setChildren(getChildrenList(node,list)))
.collect(Collectors.toList());
}