package
com.tenement.auto;
import
lombok.AllArgsConstructor;
import
lombok.Data;
import
lombok.NoArgsConstructor;
import
java.util.Arrays;
import
java.util.List;
import
java.util.stream.Collectors;
public
class
TreeExample {
@Data
@NoArgsConstructor
@AllArgsConstructor
static
class
Menu {
private
Long id;
private
String name;
private
Long parentId;
private
List<menu> children;
}
public
static
void
main(String[] args) {
List<menu> menus = menusData();
/**
* 从菜单列表中筛选出顶级菜单,并为其添加子菜单。
*
* @param menus 菜单列表,包含所有菜单项。
* @return 包含所有顶级菜单的列表,其中每个顶级菜单均已包含其所有子菜单。
*/
List<menu> topLevelMenus = menus.stream()
.filter(menu -> menu.getParentId() ==
0
|| menus.stream().noneMatch(other -> other.getId().equals(menu.getParentId())))
.peek(menu -> menu.setChildren(getChildren(menu, menus)))
.collect(Collectors.toList());
}
/**
* 获取指定菜单的所有子菜单。
*
* @param menu 指定的菜单对象,我们要查找它的子菜单。
* @param menus 所有菜单的列表,从中筛选出子菜单。
* @return 返回一个包含指定菜单所有子菜单的列表。这个列表中的每个菜单对象都可能包含它们自己的子菜单列表。
*/
private
static
List<menu> getChildren(Menu menu, List<menu> menus) {
return
menus.stream()
.filter(child -> child.getParentId().equals(menu.getId()))
.peek(child -> child.setChildren(getChildren(child, menus)))
.collect(Collectors.toList());
}
private
static
List<menu> menusData() {
return
Arrays.asList(
new
Menu(1L,
"一级菜单1"
, 0L,
null
),
new
Menu(2L,
"二级菜单1"
, 1L,
null
),
new
Menu(3L,
"三级菜单1"
, 2L,
null
),
new
Menu(4L,
"一级菜单2"
, 0L,
null
),
new
Menu(5L,
"二级菜单2"
, 4L,
null
),
new
Menu(6L,
"一级菜单3"
, 0L,
null
)
);
}
}</menu>
</menu>
</menu>
</menu>
</menu>
</menu>