前言
当需要将以上查询到的数据返回为tree,即树形数据时,如何能快速有效的完成?下面将为你解答。
一、实现步骤:
1.创建DTO,用于格式化数据
@JsonInclude(value = JsonInclude.Include.NON_EMPTY)
将该标记放在属性上,如果该属性为NULL则不参与序列化
如果放在类上边,那对这个类的全部属性起作用
Include.Include.ALWAYS 默认
Include.NON_DEFAULT 属性为默认值不序列化
Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
Include.NON_NULL 属性为NULL 不序列化
@Data
@JsonInclude(value = JsonInclude.Include.NON_EMPTY)
public static class CourceDto {
private Integer value;
private String label;
@JsonIgnore //作用在属性上,生成json时,不生成parentId 属性
private Integer parentId;
private List<CourceDto> children = new ArrayList<>();
}
2.代码实现
代码如下:
@PostMapping("check-tree-advanced")
public List<CourceDto> checkRepetitionForTreeAdvanced() throws Exception {
List<Course> courseList = courseRepo.findAll();
Map<Integer, CourceDto> map = courseList.stream().collect(Collectors.toMap(Course::getId, e -> {
CourceDto courceDto = new CourceDto();
courceDto.setValue(e.getId());
courceDto.setLabel(e.getName());
courceDto.setParentId(e.getParentId());
return courceDto;
}));
List<CourceDto> result = new ArrayList<>();
map.forEach((k, v) -> {
if (v.getParentId() == null) { // 如果parentId为空,则表述该数据为主目录
result.add(v);
} else { // 如果不为空,则找到map中对应的主目录数据,并插入children中
Integer parentId = v.getParentId();
CourceDto courceDto = map.get(parentId);
if (courceDto != null) {
courceDto.getChildren().add(v);
}
}
});
return result;
}
3.结果展示
数据将按照文科课程与理科课程进行分类: