一、使用递归
private List<NextRouteVO> recursionNextRoute(Long parentId, List<NextRouteVO> menuList) {
List<NextRouteVO> list = new ArrayList<>()
Optional.ofNullable(menuList).ifPresent(menus -> menus.stream()
.filter(menu -> parentId.equals(menu.getParentId()))
.forEach(menu -> {
// 递归获取子节点
List<NextRouteVO> children = recursionNextRoute(menu.getId(), menuList)
menu.setChildren(children)
list.add(menu)
}))
return list
}
二、使用栈(非递归)
private List<NextRouteVO> getNextRouteByDeque(List<NextRouteVO> menuList) {
Deque<NextRouteVO> deque = new ArrayDeque<>();
List<NextRouteVO> result = menuList.stream()
.filter(nextRouteVO -> SystemConstants.ROOT_MENU_ID.equals(nextRouteVO.getParentId()))
.collect(Collectors.toList());
deque.addAll(result);
while (!deque.isEmpty()) {
NextRouteVO routeVO = deque.pop();
List<NextRouteVO> children = menuList.stream()
.filter(nextRouteVO -> routeVO.getId().equals(nextRouteVO.getParentId()))
.collect(Collectors.toList());
routeVO.setChildren(children);
if (CollUtil.isNotEmpty(children)) {
deque.addAll(children);
}
}
return result;
}
三、使用Map(非递归)
private List<NextRouteVO> getNextRouteByMap(List<NextRouteVO> menuList) {
Map<Long, List<NextRouteVO>> menuMap = menuList.stream()
.collect(Collectors.groupingBy(NextRouteVO::getParentId));
for (NextRouteVO nextRouteVO : menuList) {
if (menuMap.containsKey(nextRouteVO.getId())) {
nextRouteVO.setChildren(menuMap.get(nextRouteVO.getId()));
} else {
nextRouteVO.setChildren(new ArrayList<>());
}
}
return nextRouteVOList.stream()
.filter(nextRouteVO -> SystemConstants.ROOT_MENU_ID.equals(nextRouteVO.getParentId()))
.collect(Collectors.toList());
}