把数据库中的数据,封装成如下这种格式的数据。
{
level:1,
id:1,
age:16,
children: [
{
level:2,
id:1,
age:16,
children: [
{
level:3,
id:1,
age:16,
children: []
}
]
}
]
}
递归,也就是在方法中,自己调用自己。 重点在最后一个方法
一般写法:
示例代码,根据需求修改。
//获取全部菜单
@Override
public List<Permission> queryAllMenuGuli() {
//1 查询菜单表所有数据
List<Permission> permissionList = baseMapper.selectAll();
//2 把查询所有菜单list集合按照要求进行封装
List<Permission> resultList = bulidPermission(permissionList);
return resultList;
}
//把返回所有菜单list集合进行封装的方法
public static List<Permission> bulidPermission(List<Permission> permissionList) {
//创建list集合,用于数据最终封装
List<Permission> finalNode = new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for(Permission permissionNode : permissionList) {
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
finalNode.add(selectChildren(permissionNode,permissionList));
}
}
return finalNode;
}
//递归方法。因为向一层菜单里面放二层菜单,二层里面还要放三层...
private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
//1 对象初始化
permissionNode.setChildren(new ArrayList<Permission>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for(Permission it : permissionList) {
//判断 id和pid值是否相同
if(permissionNode.getId().equals(it.getPid())) {
//菜单的level值+1
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}
//把查询出来的子菜单放到父菜单里面。这里再次调用自己
permissionNode.getChildren().add(selectChildren(it,permissionList));
}
}
return permissionNode;
}
Lambda写法:
1.Entity
@Data
public class CategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
//分类id
private Long catId;
//分类名称
private String name;
//父分类id
private Long parentCid;
//层级
private Integer catLevel;
//是否显示[0-不显示,1显示]
private Integer showStatus;
//排序
private Integer sort;
//图标地址
private String icon;
//计量单位
private String productUnit;
//商品数量
private Integer productCount;
/**
* 用来存储子菜单
*/
private List<CategoryEntity> children;
}
2, 处理方法
//树状结构显示数据
@Override
public List<CategoryEntity> listWithTree() {
//1,从数据库查出所有分类
List<CategoryEntity> entities = baseMapper.selectList(null);
//2,组装成父子的树形结构
List<CategoryEntity> Menus = entities.stream().filter((categoryEntity) -> {
//1 找出一级分类
return categoryEntity.getParentCid() == 0;
}).map((menu) -> {
//2 设置子分类
menu.setChildren(getChildrens(menu, entities));
return menu;
}).sorted((menu1,menu2) -> {
//3 菜单排序
return (menu1.getSort()==null ? 0 : menu1.getSort()) - (menu1.getSort()==null ? 0 : menu2.getSort());
}).collect(Collectors.toList());
return Menus;
}
//递归查找所有菜单的子菜单.参数1:父菜单;参数2:所有菜单
public List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all) {
List<CategoryEntity> children = all.stream().filter((categoryEntity) -> {
//1,找出子菜单
return categoryEntity.getParentCid() == root.getCatId();
}).map((categoryEntity) -> {
//2,设置子菜单
categoryEntity.setChildren(getChildrens(categoryEntity, all));
return categoryEntity;
}).sorted((menu1,menu2) -> {
//3,菜单的排序
return (menu1.getSort()==null ? 0 : menu1.getSort()) - (menu1.getSort()==null ? 0 : menu2.getSort());
}).collect(Collectors.toList());
return children;
}