1、第一版本使用的是递归处理,但是数据量大的时候,内存消耗巨大,所以斟酌下,使用了一个for循环,轻松解决树形结构
2、实体类对象:
@Data
public class WarehouseInfoDetailListResp implements Serializable {
/**
* 主键
*/
private Long id;
/**
* 上级仓储空间id
*/
private Long parentWarehouseId;
/**
* 节点信息
*/
private List<WarehouseInfoDetailListResp> warehouseInfoDetailListRespList;
}
private List<WarehouseInfoDetailListResp> transRespListToTreeList(List<WarehouseInfoDetailListResp> respList) {
Map<Long, WarehouseInfoDetailListResp> respMap = respList.stream()
.collect(Collectors.toMap(WarehouseInfoDetailListResp::getId, resp -> resp));
List<WarehouseInfoDetailListResp> resultList = new ArrayList<>();
for (WarehouseInfoDetailListResp resp : respList) {
if (respMap.containsKey(resp.getParentWarehouseId())) {
WarehouseInfoDetailListResp parent = respMap.get(resp.getParentWarehouseId());
if (parent.getWarehouseInfoDetailListRespList() == null) {
parent.setWarehouseInfoDetailListRespList(new ArrayList<>());
}
parent.getWarehouseInfoDetailListRespList().add(resp);
} else {
resultList.add(resp);
}
}
return resultList;
}
3、解释下上述代码:
首先是把所有的平面数据转成一个map,Key是Id,value是其本身
for循环便利上面的平面数据,如果当前数据的上级仓储空间id在这个map的key里面,那就说明这条数据是上级仓储空间id的子节点,所以找到通过上次仓储空间id找到那条数据value,把for循环当前的这条数据set到找到的value的字段子节点list里面