最近看了一个将列表转换成树的代码,使用了递归调用,一大坨代码与业务混合在一起,花了半天大概才看懂他想干什么?淡淡忧伤,所以自己动手设计了个通用转换模式。
列表中存储的节点Node,通用数据结构如下:
public class Node { private String id; private String value; private String parentId; private ListchildNodes; }
生成转换后的列表树方法如下:
public static ListlistToTree(List list) { Map nodeMap = list.stream().collect(Collectors.toMap(Node::getId, node -> node)); List listTree = list.stream().filter(node -> { //父节点id为空时,根节点 if (null == node.getParentId()) { return true; } Node parentNode = nodeMap.get(node.getParentId()); if (null != parentNode) { List childNodes = parentNode.getChildNodes(); if (Objects.isNull(childNodes)) { childNodes = new ArrayList<>(); parentNode.setChildNodes(childNodes); } childNodes.add(node); return false; } return true; }).collect(Collectors.toList()); return listTree; }
此方法可以通过接口进行扩展,用户可通过实现带有方法getId()、getParentId()、getChildNodes()、setChildNodes()的接口,使方法具有通用性,当然Node这时是个接口,如下:
interface Node { String getId(); String getParentId(); ListgetChildNodes(); void setChildNodes(List childNodes); }
好了,可以在团队中实现一个工具类方便List生成树了,再也没有递归那样让人无语了,也不会看了半天越看越迷糊,也许写错了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)