但是,通过测试代码我们发现这个用起来不是太爽,要将菜单数据转换为树结构竟然需要我先把菜单列表转换成树结构的列表才能调用树工具类的build方法,这里的转换操作仅仅是属性的拷贝,并未完成树状结构的生成构建,但这是调用者需要关心的吗 ?很显然TreeNode集合创建生成这个过程应该是树工具类应该做的事情。所以做了如下调整。
1 调整了build方法参数,将原有treeNodes 调整为 menuEntityList,意味着将上面说的treeNodes构建构成交给TreeUtil去做。
2 新增了Convert类,并包含convert方法,该方法的职责是完成菜单实体到树节点属性的拷贝。
3 再次调整build方法参数,新增Convert转换。
调整完成的结果,看下代码。
树工具
public class TreeUtil_1_0 {// 新增的属性转换方法
public interface Convert<MenuEntity,TreeNode>{
public void convert(MenuEntity menuEntity, TreeNode treeNode);
}
/**
* 树构建
*/
public static List<TreeNode> build(List<MenuEntity> menuEntityList,Object parentId,Convert<MenuEntity,TreeNode> convert){
// 原来调用方做的事情
List<TreeNode> treeNodes = CollectionUtil.newArrayList();
for(MenuEntity menuEntity: menuEntityList){
TreeNode treeNode = new TreeNode();
convert.convert(menuEntity,treeNode);
treeNodes.add(treeNode);
}
List<TreeNode> finalTreeNodes = CollectionUtil.newArrayList();
for(TreeNode treeNode : treeNodes){
if(parentId.equals(treeNode.getParentId())){
finalTreeNodes.add(treeNode);
innerBuild(treeNodes,treeNode);
}
}
return finalTreeNodes;
}
private static void innerBuild(List<TreeNode> treeNodes,TreeNode parentNode){
for(TreeNode childNode : treeNodes){
if(parentNode.getId().equals(childNode.getParentId())){
List<TreeNode> children = parentNode.getChildren();
if(children == null){
children = CollectionUtil.newArrayList();
parentNode.setChildren(children);
}
children.add(childNode);
childNode.setParentId(parentNode.getId());
innerBuild(treeNodes,childNode);
}
}
}
}