java结构转换-List转树结构-Stream

实体-结果对象

  • /**
     * @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

  1. 根据父节点进行分组
  2. 设置孩子节点
  3. 过滤其它节点
  • 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());
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值