可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。 比如现在有一张菜单表,具体数据如下: 下面我们就来模拟这一操作,递归组装树形结构: @Autowired JdbcTemplate jdbcTemplate;
@Test
void buildMenuTree() {
String sql = "select menu_id,menu_name,parent_id from sys_menu";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
List<Menu> menus = new ArrayList<>();
if (CollUtil.isNotEmpty(maps)) {
for (Map<String, Object> map : maps) {
Menu menu = new Menu();
menu.setId((Integer) map.get("menu_id"));
menu.setName((String) map.get("menu_name"));
menu.setParentId((Integer) map.get("parent_id"));
menus.add(menu);
}
}
//获取父节点
List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
(m) -> {
m.setChildList(getChildrens(m, menus));
return m;
}
).collect(Collectors.toList());
System.out.println("-------转json输出结果-------");
System.out.println((JSONUtil.toJsonStr(collect)));
}
/**
* 递归查询子节点
*
* @param root 根节点
* @param all 所有节点
* @return 根节点信息
*/
private List<Menu> getChildrens(Menu root, List<Menu> all) {
List<Menu> children = all.stream().filter(m -> {
return Objects.equals(m.getParentId(), root.getId());
}).map(
(m) -> {
m.setChildList(getChildrens(m, all));
return m;
}
).collect(Collectors.toList());
return children;
}
输出结果如下:
文章来源:blog.csdn.net/qq_19244927/article/details/106481777