使用场景:
为了展示菜单栏层级关系,java后端使用递归来组合数据结构,供前端使用。数据分为两部分,一部分是分组关系,一部分是选项部分(分组里边的选项列)
实例:
分组实体类:
package com.cdp.controller.bean.response;
import com.cdp.mybatis.bean.LabelGroup;
import lombok.Data;
@Data
public class LabelGroupDTO {
private String labelGroupNo;
private String labelGroupName;
private String labelGroupType;
private String labelGroupParentNo;
private Integer sort;
public LabelGroupDTO() {
super();
}
public LabelGroupDTO(LabelGroup labelGroup) {
this.labelGroupNo = labelGroup.getLabelGroupNo();
this.labelGroupName = labelGroup.getLabelGroupName();
this.labelGroupType = labelGroup.getLabelGroupType();
this.labelGroupParentNo = labelGroup.getLabelGroupParentNo();
this.sort = labelGroup.getSort();
}
}
树结构的实体类
package com.cdp.controller.bean.response;
import lombok.Data;
import java.util.List;
@Data
public class LabelDTO {
public static final String type_label = "label";
public static final String type_group = "group";
private String id;
private String name;
private String type;
private List<LabelDTO> childList;
public LabelDTO() {
super();
}
public LabelDTO(String id, String name, String type) {
this.id = id;
this.name = name;
this.type = type;
}
}
接口方法:
@Override
public Object listLabelGroup(ListLabelGroupRequestBean requestBean) {
Map<String, String> map = new HashMap<>();
map.put("labelGroupStatus", LabelGroup.labelGroupStatus_Enable);
map.put("labelGroupType", requestBean.getLabelGroupType());
List<LabelGroup> labelGroupList = labelGroupDao.listByLabelGroupStatusAndLabelGroupType(map);
List<LabelGroupDTO> labelGroupDTOList = labelGroupList.stream().map(labelGroup -> {
LabelGroupDTO labelGroupDTO = new LabelGroupDTO(labelGroup);
return labelGroupDTO;
}).collect(Collectors.toList());
List<LabelGroupDTO> parentLabelGroupDTO = labelGroupDTOList.stream()
.filter(labelGroupDTO -> labelGroupDTO.getLabelGroupParentNo().equals("parent"))
.collect(Collectors.toList());
List<LabelDTO> labelGroupTree = new ArrayList<>();
for (LabelGroupDTO labelGroupDTO : parentLabelGroupDTO) {
LabelDTO labelDTO = treeChildLabelGroup(labelGroupDTO, labelGroupDTOList);
labelGroupTree.add(labelDTO);
}
return ResponseUtils.success_body(labelGroupTree);
}
递归方法:
private LabelDTO treeChildLabelGroup(LabelGroupDTO labelGroupDTO, List<LabelGroupDTO> labelGroupList) {
LabelDTO labelDTOCount = new LabelDTO(labelGroupDTO.getLabelGroupNo(),labelGroupDTO.getLabelGroupName(),LabelDTO.type_group);
List<LabelGroupDTO> childLabelGroup = labelGroupList.stream()
.filter(labelGroup1 -> labelGroup1.getLabelGroupParentNo().equals(labelGroupDTO.getLabelGroupNo()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(childLabelGroup)) {
List<Label> labelList = labelDao.listByLabelTypeAndLabelStatusAndLabelParentNo(
labelGroupDTO.getLabelGroupType(), Label.labelStatus_Enable, labelGroupDTO.getLabelGroupNo());
List<LabelDTO> labelDTOList = labelList.stream().map(label -> {
LabelDTO labelDTO = new LabelDTO(label.getLabelNo(), label.getLabelName(), LabelDTO.type_label);
return labelDTO;
}).collect(Collectors.toList());
labelDTOCount.setChildList(labelDTOList);
return labelDTOCount;
}
List<LabelDTO> labelGroupTree = new ArrayList<>();
for (LabelGroupDTO group : childLabelGroup) {
LabelDTO labelGroup = treeChildLabelGroup(group, labelGroupList);
labelGroupTree.add(labelGroup);
}
labelDTOCount.setChildList(labelGroupTree);
return labelDTOCount;
}
最终返回值结构:
{
"status": 1,
"msg": "success",
"data": [
{
"id": "1",
"name": "ROOT",
"type": "group",
"childList": [
{
"id": "41",
"name": "基础属性",
"type": "group",
"childList": [
{
"id": "46",
"name": "自然属性",
"type": "group",
"childList": [
{
"id": "67",
"name": "固有自然属性",
"type": "group",
"childList": [
{
"id": "12",
"name": "枚举型标签_11",
"type": "label",
"childList": null
},
{
"id": "11",
"name": "枚举型标签_10",
"type": "label",
"childList": null
}
]
}
]
},
{
"id": "48",
"name": "社会属性",
"type": "group",
"childList": [
{
"id": "70",
"name": "家庭情况",
"type": "group",
"childList": [
{
"id": "285",
"name": "枚举型标签_284",
"type": "label",
"childList": null
},
{
"id": "75",
"name": "枚举型标签_74",
"type": "label",
"childList": null
}
]
}
]
},
{
"id": "181",
"name": "空间属性",
"type": "group",
"childList": [
{
"id": "182",
"name": "归属门店",
"type": "group",
"childList": []
}
]
}
]
}
]
}
]
}