可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。
比如现在有一张菜单表,具体数据如下:
下面我们就来模拟这一操作,递归组装树形结构:
@Autowired
JdbcTemplate jdbcTemplate;
1@Test 2void buildMenuTree() { 3 String sql = "select menu_id,menu_name,parent_id from sys_menu"; 4 List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); 5 List<Menu> menus = new ArrayList<>(); 6 if (CollUtil.isNotEmpty(maps)) { 7 for (Map<String, Object> map : maps) { 8 Menu menu = new Menu(); 9 menu.setId((Integer) map.get("menu_id")); 10 menu.setName((String) map.get("menu_name")); 11 menu.setParentId((Integer) map.get("parent_id")); 12 menus.add(menu); 13 } 14 } 15 //获取父节点 16 List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map( 17 (m) -> { 18 m.setChildList(getChildrens(m, menus)); 19 return m; 20 } 21 ).collect(Collectors.toList()); 22 System.out.println("-------转json输出结果-------"); 23 System.out.println((JSONUtil.toJsonStr(collect))); 24} 25 26/** 27 * 递归查询子节点 28 * 29 * @param root 根节点 30 * @param all 所有节点 31 * @return 根节点信息 32 */ 33private List<Menu> getChildrens(Menu root, List<Menu> all) { 34 List<Menu> children = all.stream().filter(m -> { 35 return Objects.equals(m.getParentId(), root.getId()); 36 }).map( 37 (m) -> { 38 m.setChildList(getChildrens(m, all)); 39 return m; 40 } 41 ).collect(Collectors.toList()); 42 return children; 43}
输出结果如下:

文章来源:blog.csdn.net/qq_19244927/article/details/106481777
