大家好,欢迎来到IT知识分享网。
在平时的业务中,避免不了使用递归,比如菜单列表,区域列表等,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理。
下来用代码做个测试
1.先定义一个实体类:
@Data public class Area { / * id */ public Integer id; / * 名称 */ public String areaName; / * 父id,根节点为0 */ public Integer parentId; / * 子节点信息 */ public List<Area> childList; public Area(Integer id, String areaName, Integer parentId) { this.id = id; this.areaName = areaName; this.parentId = parentId; } public Area(Integer id, String areaName, Integer parentId, List<Area> childList) { this.id = id; this.areaName = areaName; this.parentId = parentId; this.childList = childList; } }
2.递归组装树形结构:
public class TestTree { //模拟从数据库查询出来 List<Area> areas = Arrays.asList( new Area(1,"根节点",0), new Area(2,"陕西省",1), new Area(3,"西安市",2), new Area(4,"延安市",2), new Area(5,"雁塔区",3), new Area(6,"四川省",1), new Area(7,"成都市",6), new Area(8,"青牛区",7), new Area(9,"绵阳市",6) ); //获取父节点 List<Area> collect = areas.stream().filter(m -> m.getParentId() == 0).map( (m) -> { m.setChildList(getChildrens(m, areas)); return m; } ).collect(Collectors.toList()); / * 递归查询子节点 * @param root 根节点 * @param areaList 所有节点 * @return 根节点信息 */ private List<Area> getChildrens(Area root, List<Area> areaList) { return areaList.stream().filter(m -> { return Objects.equals(m.getParentId(), root.getId()); }).map( (m) -> { m.setChildList(getChildrens(m, areaList)); return m; } ).collect(Collectors.toList()); } @org.junit.Test public void test(){ System.out.println("-------转json输出结果-------"); System.out.println(JSON.toJSON(collect)); } }
3.展示不全,打印部分结果
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/160171.html