用java ,Lambda表达式获取一个菜单树表字段如下,id,name,ParentId ,delectableflag
时间: 2024-03-20 17:39:00 浏览: 106
假设你有一个 Menu 类,包含如下字段:
```
public class Menu {
private String id;
private String name;
private String parentId;
private boolean deletableFlag;
// 构造函数、getter、setter 等略
}
```
那么,获取一个菜单树可以使用下面的 Lambda 表达式:
```
List<Menu> menuList = Arrays.asList(
new Menu("1", "menu1", "0", true),
new Menu("2", "menu2", "1", true),
new Menu("3", "menu3", "1", false),
new Menu("4", "menu4", "2", true),
new Menu("5", "menu5", "2", false),
new Menu("6", "menu6", "3", true),
new Menu("7", "menu7", "3", false)
);
Function<Menu, String> idMapper = Menu::getId;
Function<Menu, String> parentIdMapper = Menu::getParentId;
Function<Menu, List<Menu>> childrenMapper = menu -> menuList.stream()
.filter(child -> child.getParentId().equals(menu.getId()))
.collect(Collectors.toList());
MenuTreeUtil<Menu> menuTreeUtil = new MenuTreeUtil<>();
List<Menu> menuTree = menuTreeUtil.buildTree(menuList, idMapper, parentIdMapper, childrenMapper);
System.out.println(menuTree);
```
其中,`MenuTreeUtil` 是一个工具类,用于构建树形结构,代码如下:
```
public class MenuTreeUtil<T> {
private final Map<String, T> map = new HashMap<>();
public List<T> buildTree(List<T> list, Function<T, String> idMapper, Function<T, String> parentIdMapper, Function<T, List<T>> childrenMapper) {
list.forEach(item -> map.put(idMapper.apply(item), item));
List<T> tree = new ArrayList<>();
list.forEach(item -> {
String parentId = parentIdMapper.apply(item);
if (parentId == null || !map.containsKey(parentId)) {
tree.add(item);
} else {
T parent = map.get(parentId);
childrenMapper.apply(parent).add(item);
}
});
return tree;
}
}
```
这里使用了 Java 8 中的 Stream API,`childrenMapper` 表示将每个节点的子节点列表转换成 `List<Menu>` 类型。最终输出的 `menuTree` 即为构建好的树形结构。
阅读全文