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);
}