Java List转树形结构
Zz要变强 人气:0在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合,比如:省市单位,部门机构,书籍分类等
TreeNode对象
@Data @AllArgsConstructor @NoArgsConstructor public class TreeNode { /** * 节点内码 */ private Long id; /** * 节点名称 */ private String label; /** * 父节点内码 */ private Long pid; /** * 子节点集合 */ private List<TreeNode> children; }
转换工具类
方式一:foreach遍历
对所传递的treeList进行遍历,然后判断该节点的父id与传递的id是否相同,相同则递归设置其孩子节点,并将该节点的放入children集合中,用于统一返回父节点相同的所有TreeNode对象。
方式二:stream流
基于filter()实现数据过滤
该方法会接收一个返回boolean的函数作为参数,终返回一个包括所有符合条件元素的流。
基于map()对元素进行转换
它接收一个函数作为方法参数,这个函数会被应用到集合中每一个 元素上,并终将其映射为一个新的元素。
对集合中的元素进行过滤,通过filter将父id相同的所有节点过滤出来,然后在map中递归设置其孩子节点,并返回。
public class List2TreeList { //方式一: 使用foreach转换 public static List<TreeNode> buildTreeUseList(List<TreeNode> treeList,long id){ //收集传递的集合中父id相同的TreeNode List<TreeNode> children = new ArrayList<>(); for (TreeNode treeNode : treeList) { //判断该节点的父id,是否与传入的父id相同,相同则递归设置其孩子节点,并将该节点放入children集合中 if(treeNode.getPid() == id){ //递归设置其孩子节点 treeNode.setChildren(buildTreeUseList(treeList, treeNode.getId())); //放入children集合 children.add(treeNode); } } return children; } //方式二: 使用stream流转换 public static List<TreeNode> buildTreeUseStream(List<TreeNode> treeList,long id){ List<TreeNode> list = treeList.stream() //过滤父节点与传递的id相同的TreeNode对象 .filter( treeNode -> treeNode.getPid().longValue() == id ) .map( treeNode -> { //递归设置孩子节点 treeNode.setChildren(buildTreeUseStream(treeList,treeNode.getId())); return treeNode; }) .collect(Collectors.toList()); return list; } }
功能测试
传入集合数据及最高节点的父id进行转换
@RestController public class TestController { @GetMapping("/treeList") public List<TreeNode> convert2Tree(){ List<TreeNode> list = new ArrayList<>(); list.add(new TreeNode(370000l,"山东省",0l,null)); list.add(new TreeNode(370100l,"济南市",370000l,null)); list.add(new TreeNode(370200l,"青岛市",370000l,null)); list.add(new TreeNode(370300l,"淄博市",370000l,null)); list.add(new TreeNode(371300l,"临沂市",370000l,null)); list.add(new TreeNode(370102l,"历下区",370100l,null)); list.add(new TreeNode(370103l,"市中区",370100l,null)); list.add(new TreeNode(370202l,"市南区",370200l,null)); //使用list转换 List<TreeNode> treeList = List2TreeList.buildTreeUseList(list, 0l); System.out.println(treeList); return treeList; } }
TreeList结果格式
转换后的集合数据格式
[ { "id": 370000, "label": "山东省", "pid": 0, "children": [ { "id": 370100, "label": "济南市", "pid": 370000, "children": [ { "id": 370102, "label": "历下区", "pid": 370100, "children": [] }, { "id": 370103, "label": "市中区", "pid": 370100, "children": [] } ] }, { "id": 370200, "label": "青岛市", "pid": 370000, "children": [ { "id": 370202, "label": "市南区", "pid": 370200, "children": [] } ] }, { "id": 370300, "label": "淄博市", "pid": 370000, "children": [] }, { "id": 371300, "label": "临沂市", "pid": 370000, "children": [] } ] } ]
加载全部内容