java递归生成树菜单

java递归生成树菜单


要给前端返回类似下面的json格式

[
    {
        "title": "一级1",
        "id": 1,
        "children": [
            {
                "title": "二级1-1",
                "id": 3,
                "children": [
                    {
                        "title": "三级1-1-3",
                        "id": 23
                    },
                    {
                        "title": "三级1-1-1",
                        "id": 7
                    },
                    {
                        "title": "三级1-1-2",
                        "id": 8,
                        "field": ""
                    }
                ]
            }
        ]
    }
]

Java 后端
1:利用mybatis的递归查询 ( 数据库查询比较浪费时间,之前文章有介绍,有兴趣查看之前的博客文章)
2:数据查询所有数据,代码递归生成对象(本次介绍的就是这种)
2.1 普通版

 //源数据
 List<VoMenu> list=menuService.findTreeMenuByRole(StringUtils.isEmpty(midList)?"":midList);
 //递归生成的数据
 List<VoMenu> newMenuList = new ArrayList<VoMenu>();
 for (int i = 0; i < list.size(); i++) {
     // 一级菜单pId=0
     if (list.get(i).getPid().equals("0")) {
         newMenuList.add(list.get(i));
     }
 }
 for (VoMenu menu : newMenuList) {
 	//调用setTree 方法
     menu.setChildren(setTree(""+menu.getId(), list));
 }
 

setTree 方法


	private List<VoMenu> setTree(String id,List<VoMenu> list) {
        // 子菜单
        List<VoMenu> childList = new ArrayList<>();
        for (VoMenu menu : list) {
            // 遍历所有节点,将父菜单id与传过来的id比较
            if (menu.getPid().equals(id)) {
                childList.add(menu);
            }
        }
        // 把子菜单的子菜单再循环一遍
        for (VoMenu menu : childList) {
            menu.setChildren(setTree(""+menu.getId(), list));
        }
        if (childList.size() == 0) {
            return Lists.newArrayList();
        }
        return childList;
    }
    

2.2优化版

import com.alibaba.fastjson.JSON;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

public class CategoryUtil {
    public CategoryUtil() {
    }

    public static List<VoMenu> buildTree(List<VoMenu> categoryInfos) {
        List<VoMenu> collect = (List)categoryInfos.stream().filter((data) -> {
            return Objects.isNull(data.getParentCategoryId());
        }).collect(Collectors.toList());
        collect.forEach((data) -> {
            buildTree(data, categoryInfos);
        });
        return collect;
    }

    private static void buildTree(VoMenu vo, List<VoMenu> newlist) {
        String id = vo.getId();
        if (StringUtils.isEmpty(id)) {
            throw new ServiceException(String.format("数据异常,data:%s", JSON.toJSON(vo)));
        } else {
            List<VoMenu> subList = (List)newlist.stream().filter((target) -> {
                return Objects.nonNull(target.getPid()) && id.equals(target.getPid());
            }).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(subList)) {
                subList.forEach((subData) -> {
                    buildTree(subData, newlist);
                });
                vo.setChildren(subList);
            }

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值