Java如何筛选树行菜单列表?

目前有一菜单列表,包含用户权限标识

原始数据样子

    1.菜单1 (true)
      1.1 菜单1.1 (true)
      1.2 菜单1.2 (false)
    2.菜单2(true)
      2.1 菜单2.1(true) 
         2.1.1 菜单2.1.1(true)
      2.2 菜单2.2(false)
    3.菜单3(false)
      3.1 菜单3.1(false)

想得到的数据样子,过滤所有标识为true的数据

    1.菜单1 (true)
      1.1 菜单1.1 (true)
    2.菜单2(true)
      2.1 菜单2.1(true) 
         2.1.1 菜单2.1.1(true)

示例

@Data
public class Menu {
    private String id;
    private String name;
    private String url;
    private boolean hasMenu;
    private List<Menu> subMenu;
}
    [
        {
            "id":"1",
            "name":"菜单1",
            "hasMenu":true,
            "subMenu":[
                {
                    "id":"2",
                    "name":"菜单1.1",
                    "hasMenu":true,
                    "subMenu":[]
                },
                {
                    "id":"3",
                    "name":"菜单1.2",
                    "hasMenu":true,
                    "subMenu":[]
                }
            ]
        },
        {
            "id":"4",
            "name":"菜单2",
            "hasMenu":true,
            "subMenu":[
                {
                    "id":"5",
                    "name":"菜单2.1",
                    "hasMenu":true,
                    "subMenu":[
                        {
                            "id":"6",
                            "name":"菜单2.1.1",
                            "hasMenu":true,
                            "subMenu":[]
                        }
                    ]
                },
                {
                    "id":"7",
                    "name":"菜单2.2",
                    "hasMenu":false,
                    "subMenu":[]
                }
            ]
        }
    ]

如何去比较有效的去过滤相关数据

阅读 3.8k
4 个回答

查询的时候加个条件不行?

层次遍历 , 删掉false 对象就好了呀

这个是从数据库来的?那可以 select 时加条件

如果是已经确定的 object,只能遍历去除

如果是要转换成 Json 或者从 Json 转换成 Object,可以参考一下@JsonDeserialize,@JsonSerialize

我的想法是可以在 subMenu 上自定义序列化/反序列化 method,对于 sub 为 false 的不处理,此方法没有尝试过,不确定是否可行

最后选择的还是一个循环递归去筛选过滤整个数据

public List<Menu> getHasMenu(List<Menu> allMenuTree){
    List<Menu> userMenuList = new ArrayList<>();
    if (!CollectionUtils.isEmpty(allMenuTree)){
        for (Menu menu : allMenuTree){
            if (menu.isHasMenu()){
                List<Menu> subMenu = menu.getSubMenu();
                if (!CollectionUtils.isEmpty(subMenu)) {
                    menu.setSubMenu(getHasMenu(subMenu));
                }
                userMenuList.add(menu);
            }
        }
    }
    
    return userMenuList;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题