翻到祖师爷代码,发现树结构的数据是后端通过递归去生成的,效率非常低,请问有什么方法可以优化吗?
public List<Map> createGroupTreeNode() {
List<Map> childrenList = new ArrayList<Map>();
getChildList(0L,childrenList);
List<Map> treeList = new ArrayList<Map>();
Map map = new HashMap();
map.put("id", 0);
map.put("text","根节点");
map.put("isleaf", "0");
map.put("icon", "fa fa-folder");
Map subMap = new HashMap();
subMap.put("opened", true);
subMap.put("selected", true);
map.put("state", subMap);
map.put("children", childrenList);
treeList.add(map);
return treeList;
}
public List<Map> getChildList(Long id,List<Map> childrenList){
List<BaseGroup> childList = baseMapper.childListByParentId(id);
if(childList != null && childList.size() > 0){
List<Map> tempMap = new ArrayList<Map>();
for(int i = 0; i < childList.size(); i++){
List<Map> mylist = getChildList(childList.get(i).getId(),childrenList);
Map map = new HashMap();
if(mylist == null){
map.put("id", childList.get(i).getId());
map.put("text", childList.get(i).getNumber() + " - " + childList.get(i).getName());
map.put("isleaf", "1");
map.put("icon", "fa fa-folder");
Map subMap = new HashMap();
subMap.put("opened", false);
map.put("state", subMap);
tempMap.add(map);
}else{
map.put("id", childList.get(i).getId());
map.put("text", childList.get(i).getNumber() + " - " + childList.get(i).getName());
map.put("isleaf", "0");
map.put("icon", "fa fa-folder");
map.put("children", mylist);
Map subMap = new HashMap();
subMap.put("opened", false);
map.put("state", subMap);
tempMap.add(map);
}
if(id == 0){
childrenList.add(map);
}
}
return tempMap;
}
return null;
}
getChildList
的childrenList
看起来是个输出参数,这里只有在id == 0L
的时候会把元素加到childrenList
中去。所以这个输入参数只在id == 0L
的时候会使用。既然getChildList
会把找到的列表返回出去,那完全不需要这个输出参数,在createGroupTreeNode
里直接使用它的返回值就好。总体来说,关于递归,就只有这一点问题。
然后在里面,for 循环中的循环变量 i 只有一个作用,就是
childList.get(i)
,频繁的去使用childList.get(i)
肯定不如缓存一个变量效率高,所以可以改为或者直接用增强 for 循环
另外在 for 循环中的 if 分支,比较一下发现只有一丁点区别,就是在处理
isleaf
和children
的时候,所以可以把其他.put
都提取出来,只处理有差异的部分