java实现返回树形结构

 更新时间:2026年06月15日 10:31:34   作者:星岳  
这篇文章主要介绍了java实现返回树形结构方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、需求说明

在做项目的时候前台要显示一个树形目录,比如下面这样:

二、添加数据库表

1、创建数据库表

2、添加测试数据

三、后端代码实现

PS:该测试类中的create_time和update_time写在BaseEntity中,可以忽略!!!

1、创建实体类

@TableName(value ="menu")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu extends BaseEntity implements Serializable {
    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 菜单名称
     */
    private String name;

    /**
     * 父id
     */
    private Integer parentId;

    /**
     * 子节点信息
     */
    @ApiModelProperty("子节点信息")
    public List<Menu> childList;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

2、添加实现类

(1)添加一个查询所有数据接口

    public List<Menu> searchAll() {
        return menuMapper.searchAll();
    }
    <select id="searchAll" resultType="com.atjava.mybatisx.pojo.Menu">
        select * from menu
    </select>

实现方法一:

    public List<Menu> searchTreeMenu() {
        List<Menu> menus = searchAll();
        List<Menu> TreeMenu = menus.stream().filter(m -> m.getParentId() == 1).map(
                (m) -> {
                    m.setChildList(getChildrens(m,menus));
                    return m;
                }
        ).collect(Collectors.toList());
        return TreeMenu;
    }


    private List<Menu> getChildrens(Menu root, List<Menu> all) {

        List<Menu> children = all.stream().filter(m -> {
            return Objects.equals(m.getParentId(), root.getId());
        }).map(
                (m) -> {
                    m.setChildList(getChildrens(m, all));
                    return m;
                }
        ).collect(Collectors.toList());
        return children;
    }

实现方法二:

public List<Menu> searchTreeMenu() {
        List<Menu> menus = searchAll();

        List<Menu> roots = new ArrayList<>();
        List<Menu> TreeMenu = new ArrayList<>();

        //获取最外层集合
        for (Menu menu : menus) {
            //0代表最高用户
            if (menu.getParentId() == 0) {
                roots.add(menu);
            }
        }
        //从最高级别用户开始遍历,递归找到该用户的下级用户,将带有下级的最高级用户放入返回结果中
        for (Menu root : roots) {
            root = buildUserTree(menus, root);
            TreeMenu.add(root);
        }
        return TreeMenu;
    }

 public Menu buildUserTree(List<Menu> allMenus, Menu menu) {
        List<Menu> children = new ArrayList<>();
        for (Menu menu1 : allMenus) {
            //0代表根节点,无需重复比较
            if (menu1.getParentId() == 0)
                continue;
            //当前用户的上级编号和传入的用户编号相等,表示该用户是传入用户的下级用户
            if (menu1.getParentId() == menu.getId()) {
                //递归调用,获取该用户的下级用户
                menu1 = buildUserTree(allMenus, menu1);
                children.add(menu1);
            }
        }
        //给该用户的children属性赋值,并返回该用户
        menu.setChildList(children);
        return menu;
    }

3、添加请求接口

@Api(tags = "菜单管理")
@RestController
@RequestMapping("/menu")
public class MenuController {

    @Autowired
    MenuService menuService;

    @ApiOperation("获取树形菜单")
    @GetMapping("/searchTreeMenu")
    public ResponseResult<Menu> searchTreeMenu(){
        List<Menu> menus = menuService.searchTreeMenu();
        return ResponseResult.ok(menus);
    }

}

四、使用swagger测试

 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 细数java中Long与Integer比较容易犯的错误总结

    细数java中Long与Integer比较容易犯的错误总结

    下面小编就为大家带来一篇细数java中Long与Integer比较容易犯的错误总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java RandomAccessFile的用法详解

    Java RandomAccessFile的用法详解

    下面小编就为大家带来一篇Java RandomAccessFile的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 一文详解Java中的JSON数据处理指南

    一文详解Java中的JSON数据处理指南

    JSON作为一种轻量级的数据交换格式,在Web服务和应用程序之间广泛使用,本文详细介绍了在Java中解析和操作JSON数据的步骤,包括导入库、创建JSON对象和数组、读取数据、创建和序列化JSON对象,以及错误处理等,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 解决java try throw exception finally遇上return break continue造成异常丢失

    解决java try throw exception finally遇上return break conti

    这篇文章主要介绍了解决java try throw exception finally遇上return break continue造成异常丢失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java项目实现统一打印入参出参等日志

    java项目实现统一打印入参出参等日志

    这篇文章主要介绍了java项目实现统一打印入参出参等日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于java TCP网络通信的实例详解

    基于java TCP网络通信的实例详解

    本篇文章是对java中TCP网络通信的实例进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于Java中阻塞队列BlockingQueue的详解

    关于Java中阻塞队列BlockingQueue的详解

    这篇文章主要介绍了关于Java中阻塞队列BlockingQueue的详解,BlockingQueue是为了解决多线程中数据高效安全传输而提出的,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞,需要的朋友可以参考下
    2023-05-05
  • 关于Springboot数据库配置文件明文密码加密解密的问题

    关于Springboot数据库配置文件明文密码加密解密的问题

    这篇文章主要介绍了Springboot数据库配置文件明文密码加密解密的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java中for循环的执行过程分析

    Java中for循环的执行过程分析

    这篇文章主要介绍了Java中for循环的执行过程,实例分析了for循环的执行原理与顺序,对于深入理解Java具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • java基础之注解示例详解

    java基础之注解示例详解

    大家好,本篇文章主要讲的是java基础之注解示例详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论