java中springboot递归树的使用实例教程,菜单栏实例将分组和选项带入树结构

该博客介绍了如何在Java后端使用递归方法构建树形结构的数据,以便展示菜单栏的层级关系。通过创建分组实体类和树结构实体类,实现了从数据库获取数据并进行递归处理,最终生成包含分组和选项的菜单树。递归方法用于处理分组及其子分组,并将标签分组转换为前端可用的结构。
摘要由CSDN通过智能技术生成

使用场景:

为了展示菜单栏层级关系,java后端使用递归来组合数据结构,供前端使用。数据分为两部分,一部分是分组关系,一部分是选项部分(分组里边的选项列)

实例:

分组实体类:

package com.cdp.controller.bean.response;

import com.cdp.mybatis.bean.LabelGroup;
import lombok.Data;

//分组实体
@Data
public class LabelGroupDTO {

    /**
     * 标签分组ID
     */
    private String labelGroupNo;

    /**
     * 标签分组名称
     */
    private String labelGroupName;

    /**
     * 标签分组类型 OFFLINE_LABEL:离线标签
     */
    private String labelGroupType;

    /**
     * 所属分组(根据labelGroupNo获取下级分组)
     */
    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";

    //id
    private String id;
    //名称
    private String name;
    //group:分组,label:标签
    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);
    }

递归方法:

/**
     * 递归
     * @param labelGroupDTO  当前的分组
     * @param labelGroupList 总分组集合
     */
    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": []
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酸菜鱼(szy)

如果给您提供帮助的话可以打赏哦

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

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

打赏作者

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

抵扣说明:

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

余额充值