1.普通递归遍历菜单树
/**
*
* @param menus:父接节点
* @return
*/
private List<MenuDTO> recursiveFindMenu(List<TreeMenuResult> menus) {
List<MenuDTO> resultMenus= Lists.newArrayList();
for (TreeMenuResult menuResult:menus) {
MenuDTO menuDTO=new MenuDTO();
menuDTO.setPermissionCode(menuResult.getPermissionName());
menuDTO.setParentId(menuResult.getMenuParentId());
menuDTO.setUrl(menuResult.getMenuUrl());
menuDTO.setId(menuResult.getMenuId());
menuDTO.setTitle(menuResult.getMenuTitle());
if (CollectionUtils.isNotEmpty(menuResult.getSubMenus())){
List<MenuDTO> subMenus = recursiveFindMenu(menuResult.getSubMenus());
if (CollectionUtils.isNotEmpty(subMenus)){
menuDTO.setSubMenus(subMenus);
}
}
resultMenus.add(menuDTO);
}
return resultMenus;
}
2.使用stream流递归遍历
public class TreeTest {
public static void main(String[] args) {
List<Menus> menus = Arrays.asList(
new Menus(1, "根节点", 0),
new Menus(2, "子节点1", 1),
new Menus(3, "子节点1.1", 2),
new Menus(4, "子节点1.2", 2),
new Menus(5, "根节点1.3", 2),
new Menus(6, "根节点2", 1),
new Menus(7, "根节点2.1", 6),
new Menus(8, "根节点2.2", 6),
new Menus(11, "根节点3", 1),
new Menus(12, "根节点3.1", 11)
);
//获取父节点
List<Menus> collect = menus.stream().filter(m -> m.getParentCode() == 0).map(m -> {
System.out.println(m);
m.setChildOrg(getChilderens(m, menus));
return m;
}).collect(Collectors.toList());
System.out.println(JSON.toJSON(collect));
}
/**
* 递归子节点
*
* @param root 根节点
* @param menus 所有节点
* @return 根节点信息
*/
private static List<Menus> getChilderens(Menus root, List<Menus> menus) {
System.out.println("=========:"+root);
List<Menus> children = menus.stream().filter(m -> {
return Objects.equals(m.getParentCode(), root.getOrgCode());
}).map(m ->
{
m.setChildOrg(getChilderens(m, menus));
return m;
}
).collect(Collectors.toList());
return children;
}
}
3.菜单树tree结构转化为结构
//判断是否存在子集
private static boolean ifChilds(List<?> list) {
boolean flag = false;
if (list != null && list.size() != 0) {
flag = true;
}
return flag;
}
/**
* 将tree结构数据转成List结构
*
* @param list
* @return
*/
public void treeToList(TreeMenuResult node, List<TreeMenuResult> list) {
if (list == null) {
list = new ArrayList<TreeMenuResult>();
}
//设置当前节点的必要数据
TreeMenuResult nodeValue = new TreeMenuResult();
nodeValue.setMenuId(node.getMenuId());
nodeValue.setMenuTitle(node.getMenuTitle());
nodeValue.setMenuParentId(node.getMenuParentId());
nodeValue.setMenuUrl(node.getMenuUrl());
nodeValue.setPermissionName(node.getPermissionName());
list.add(nodeValue);
//遍历递归子节点
if (ifChilds(node.getSubMenus())) {
for (int i = 0; i < node.getSubMenus().size(); i++) {
TreeMenuResult node_ = node.getSubMenus().get(i);
treeToList(node_, list);
}
}
}