List构建树形结构

List构建树形结构

// 目标树形数据结构
public class LocationDto {

    /**
     * 空间id.
     */
    @Schema(description = "空间id", name = "id")
    private UUID id;

    /**
     * 子节点.
     */
    @Schema(description = "子节点", name = "children")
    private List<LocationDto> children;

    /**
     * 父节点id.
     */
    @Schema(description = "父节点id", name = "parentId")
    private UUID parentId;
}

// 源数据
public class LocationEntity {
    @TableId
    protected UUID id;
  
    /**
     * 父级id.
     */
    @TableField("parent_id")
    private UUID parentId;
}


方法实现:
     /**
     * 将List<LocationEntity>转成树形结构.
     * 次根节点的LocationEntity.parentId为null,没有最上层的根节点(或者说根节点可能为多个)
     *
     * @param searchDto 查询参数
     * @return 成功返回SUCCESS, 失败返回相应错误码
     */
public ApiResultDto<List<LocationDto>> getTreeByParams(LocationSearchDto searchDto, SecurityUser user) {
        List<LocationEntity> locationEntities = locationDao.findByParams(searchDto); // 数据源
        List<LocationDto> locationDtos = locationEntities.stream().map(t -> {
            LocationDto dto = new LocationDto();
            dto.setId(t.getId());
            dto.setName(t.getName());
            iterChild(dto); // 递归构建树形结构
            return dto;
        }).collect(Collectors.toList());
        return ApiResultDto.success(locationDtos);
    }

    /**
     * 遍历子节点.
     *
     * @param dto 空间dto
     */
    private void iterChild(LocationDto dto) {
        List<LocationEntity> locations = locationDao.findChildById(dto.getId());
        if (CollectionUtils.isEmpty(locations)) {
            return;
        }
        List<LocationDto> locationDtos = locations.stream().map(t -> {
            LocationDto childDto = new LocationDto();
            childDto.setId(t.getId());
            childDto.setName(t.getName());
            //遍历子节点
            iterChild(childDto);
            return childDto;
        }).collect(Collectors.toList());
        dto.setChildren(locationDtos);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员码小跳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值