倒序遍历
//倒序遍历
for (int i = menuMaps.size() - 1; i >= 0; i--) {
//****删除的逻辑
}
案例,
根据权限获取菜单数据,把没有不符合要求的要删除掉
/**
* 根据父级ID查询生成一个tree结构的数据
*
* @param map 要包含id,是把当前记录的id作为父级来查询的,如果查询顶级,id=0
* @return tree结构的数组
*/
@Override
public List<Map<String, Object>> getTreeMenuByPermission(Map<String, Object> map, Set<String> permissions) {
//构造条件构造器
LambdaQueryWrapper<SysMenu> lqw = new LambdaQueryWrapper();
//添加过滤条件
lqw.eq(SysMenu::getTjclass, 1) //分类:1=左侧菜单,2=操作按钮,3=显示页面
.eq(SysMenu::getParent, map.get("id")); //父级id
//查询出符合条件的菜单数据多条
List<Map<String, Object>> menuMaps = listMaps(lqw);
if (menuMaps.size() > 0) {
//倒序遍历
for (int i = menuMaps.size() - 1; i >= 0; i--) {
String path = (String) menuMaps.get(i).get("path");
if (StringUtils.isNotEmpty(path)) {
//如果不在权限里,则跳出循环
log.info("权限:{},是否存在:{}", path, permissions.contains(path));
if (!permissions.contains(path)) {
log.info("被移除的:{}", menuMaps.get(i));
menuMaps.remove(i);//去除没有权限的记录
log.info("循环次数i={}", i);
log.info("移除后的menuMaps:{}", menuMaps);
continue;
}
log.info("权限:{}", permissions);
//递归调用
List<Map<String, Object>> treeMenu = getTreeMenuByPermission(menuMaps.get(i), permissions);
//如果递归有值,则把值传给“children”,并put到map中,并标记hasChildren=1
if (treeMenu != null) {
menuMaps.get(i).put("hasChildren", 1);
menuMaps.get(i).put("children", treeMenu); //这个是把递归的数据添加到children下面
} else {
menuMaps.get(i).put("hasChildren", 0);
}
log.info("map = " + menuMaps.get(i));
}
}
return menuMaps;
}
return null;
}