优化祖传递归树结构生成代码
本文针对一段使用递归生成树结构的代码进行性能优化分析。代码的主要问题在于使用了低效的递归方式以及一些可优化的细节。
原始代码中,creategrouptreenode 函数调用 getchildlist 函数递归生成树形结构。getchildlist 函数接收一个父节点 id 和一个列表作为参数,递归地查询子节点并添加到列表中。然而,这种方式存在效率问题。
首先,getchildlist 函数的第二个参数 childrenlist 实际上是一个输出参数,只有当 id == 0l 时才会使用。 这导致了不必要的参数传递和内存开销。我们可以直接修改 getchildlist 函数,使其返回生成的子节点列表,从而消除这个冗余参数。 修改后的 creategrouptreenode 函数可以直接使用 getchildlist 函数的返回值,简化代码结构并提高效率。
其次,在 getchildlist 函数的 for 循环中,反复调用 childlist.get(i) 获取 basegroup 对象,造成了不必要的性能损耗。 我们可以通过引入一个中间变量缓存 childlist.get(i) 的结果,或者直接使用增强型 for 循环来避免重复访问数组元素。
此外,for 循环内部的 if 分支条件判断语句中,大部分代码都是相同的,只有 isleaf 和 children 属性的值不同。 我们可以将公共部分提取出来,只保留差异部分的判断,从而简化代码并提高可读性。
通过以上优化,可以有效提高代码效率,减少不必要的内存开销和计算次数。 具体优化方案如下:
修改后的 creategrouptreenode 函数:
public list<map> creategrouptreenode() { list<map> childrenlist = getchildlist(0l); // .... }
修改后的 getchildlist 函数:
public List<Map> getChildList(Long id) { List<BaseGroup> childList = baseMapper.childListByParentId(id); if(childList != null && childList.size() > 0){ List<Map> tempMap = new ArrayList<Map>(); for (BaseGroup it : childList) { Map map = new HashMap(); map.put("id", it.getId()); map.put("text", it.getNumber() + " - " + it.getName()); map.put("icon", "fa fa-folder"); Map subMap = new HashMap(); subMap.put("opened", false); map.put("state", subMap); List<Map> mylist = getChildList(it.getId()); if (mylist == null) { map.put("isleaf", "1"); } else { map.put("isleaf", "0"); map.put("children", mylist); } tempMap.add(map); } return tempMap; } return null; }