100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java树形结构烦返回值 构建下拉菜单

Java树形结构烦返回值 构建下拉菜单

时间:2019-04-26 10:52:28

相关推荐

Java树形结构烦返回值 构建下拉菜单

写一个用java实现的树形结构

在开发中遇到情景,前端需要实现目录或者部门的树形结构的下拉选项,需要后端构造一个树形的结构

1.定义一个树形结构类

import java.util.List;public class TreeNode {/*** 元素id*/private long id;/*** 元素名*/private String label;/*** 子元素*/private List<TreeNode> children;public TreeNode() {}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}public List<TreeNode> getChildren() {return children;}public void setChildren(List<TreeNode> children) {this.children = children;}}

2、为树形结构添加节点

设计表和实体类

以菜单为例,数结构的数据在数据库表里要有父id字段

对应的实体类

注意添加一个子节点属性

/** 子菜单 */private List<SysMenu> children = new ArrayList<SysMenu>();

package mon.core.domain.entity;import java.util.ArrayList;import java.util.List;import javax.validation.constraints.NotBlank;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import mons.lang3.builder.ToStringBuilder;import mons.lang3.builder.ToStringStyle;import mon.core.domain.BaseEntity;/*** 菜单权限表 sys_menu* * @author lcq*/public class SysMenu {/** 菜单ID */private Long menuId;/** 菜单名称 */private String menuName;/** 父菜单名称 */private String parentName;/** 父菜单ID */private Long parentId;/** 显示顺序 */private Integer orderNum;/** 路由地址 */private String path;/** 组件路径 */private String component;/** 路由参数 */private String query;/** 是否为外链(0是 1否) */private String isFrame;/** 是否缓存(0缓存 1不缓存) */private String isCache;/** 类型(M目录 C菜单 F按钮) */private String menuType;/** 显示状态(0显示 1隐藏) */private String visible;/** 菜单状态(0正常 1停用) */private String status;/** 权限字符串 */private String perms;/** 菜单图标 */private String icon;/** 子菜单 */private List<SysMenu> children = new ArrayList<SysMenu>();public Long getMenuId(){return menuId;}public void setMenuId(Long menuId){this.menuId = menuId;}public String getMenuName(){return menuName;}public void setMenuName(String menuName){this.menuName = menuName;}public String getParentName(){return parentName;}public void setParentName(String parentName){this.parentName = parentName;}public Long getParentId(){return parentId;}public void setParentId(Long parentId){this.parentId = parentId;}public Integer getOrderNum(){return orderNum;}public void setOrderNum(Integer orderNum){this.orderNum = orderNum;}public String getPath(){return path;}public void setPath(String path){this.path = path;}public String getComponent(){return component;}public void setComponent(String component){ponent = component;}public String getQuery(){return query;}public void setQuery(String query){this.query = query;}public String getIsFrame(){return isFrame;}public void setIsFrame(String isFrame){this.isFrame = isFrame;}public String getIsCache(){return isCache;}public void setIsCache(String isCache){this.isCache = isCache;}public String getMenuType(){return menuType;}public void setMenuType(String menuType){this.menuType = menuType;}public String getVisible(){return visible;}public void setVisible(String visible){this.visible = visible;}public String getStatus(){return status;}public void setStatus(String status){this.status = status;}public String getPerms(){return perms;}public void setPerms(String perms){this.perms = perms;}public String getIcon(){return icon;}public void setIcon(String icon){this.icon = icon;}public List<SysMenu> getChildren(){return children;}public void setChildren(List<SysMenu> children){this.children = children;}@Overridepublic String toString() {return "SysMenu{" +"menuId=" + menuId +", menuName='" + menuName + '\'' +", parentName='" + parentName + '\'' +", parentId=" + parentId +", orderNum=" + orderNum +", path='" + path + '\'' +", component='" + component + '\'' +", query='" + query + '\'' +", isFrame='" + isFrame + '\'' +", isCache='" + isCache + '\'' +", menuType='" + menuType + '\'' +", visible='" + visible + '\'' +", status='" + status + '\'' +", perms='" + perms + '\'' +", icon='" + icon + '\'' +", children=" + children +'}';}}

构建父子关系

传入一个菜单列表参数,返回父子关系

/*** 构建前端所需要树结构* * @param menus 菜单列表* @return 树结构列表*/public List<SysMenu> buildMenuTree(List<SysMenu> menus){List<SysMenu> returnList = new ArrayList<SysMenu>();List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList());for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();){SysMenu menu = (SysMenu) iterator.next();// 如果是顶级节点, 遍历该父节点的所有子节点if (!tempList.contains(menu.getParentId())){recursionFn(menus, menu);returnList.add(menu);}}if (returnList.isEmpty()){returnList = menus;}return returnList;}/*** 递归列表* * @param list 分类表* @param t 子节点*/private void recursionFn(List<SysMenu> list, SysMenu t){// 得到子节点列表List<SysMenu> childList = getChildList(list, t);t.setChildren(childList);for (SysMenu tChild : childList){if (hasChild(list, tChild)){recursionFn(list, tChild);}}}/*** 得到子节点列表*/private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t){List<SysMenu> tlist = new ArrayList<SysMenu>();Iterator<SysMenu> it = list.iterator();while (it.hasNext()){SysMenu n = (SysMenu) it.next();if (n.getParentId().longValue() == t.getMenuId().longValue()){tlist.add(n);}}return tlist;}/*** 判断是否有子节点*/private boolean hasChild(List<SysMenu> list, SysMenu t){return getChildList(list, t).size() > 0;}

3、调用方法 封装进Tree Node中

先再TreeNode里添加菜单的构造方法

用于封装自定义数据节点

public TreeNode(SysMenu menu){this.id = menu.getMenuId();this.label = menu.getMenuName();this.children = menu.getChildren().stream().map(TreeNode::new).collect(Collectors.toList());}

完整的TreeNode

package com.redis_demo.entity;import java.util.List;import java.util.stream.Collectors;public class TreeNode {/*** 元素id*/private long id;/*** 元素名*/private String label;/*** 子元素*/private List<TreeNode> children;public TreeNode() {}public TreeNode(SysMenu menu){this.id = menu.getMenuId();this.label = menu.getMenuName();this.children = menu.getChildren().stream().map(TreeNode::new).collect(Collectors.toList());}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}public List<TreeNode> getChildren() {return children;}public void setChildren(List<TreeNode> children) {this.children = children;}}

方法调用 完成封装

@Overridepublic List<TreeNode> buildMenuTreeSelect(List<SysMenu> menus){List<SysMenu> menuTrees = buildMenuTree(menus);return menuTrees.stream().map(TreeNode::new).collect(Collectors.toList());}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。