add extra for TreeNode

This commit is contained in:
Looly 2020-03-25 11:35:07 +08:00
parent 308368cffd
commit 8f84997e8e
5 changed files with 61 additions and 27 deletions

View File

@ -1,6 +1,8 @@
package cn.hutool.core.lang.tree;
import java.util.Map;
/**
* 树节点 每个属性都可以在{@link TreeNodeConfig}中被重命名<br>
* 在你的项目里它可以是部门实体地区实体等任意类树节点实体
@ -31,6 +33,11 @@ public class TreeNode<T> implements Node<T> {
*/
private Comparable<?> weight = 0;
/**
* 扩展字段
*/
private Map<String, Object> extra;
/**
* 空构造
@ -99,4 +106,26 @@ public class TreeNode<T> implements Node<T> {
this.weight = weight;
return this;
}
/**
* 获取扩展字段
*
* @return 扩展字段Map
* @since 5.2.5
*/
public Map<String, Object> getExtra() {
return extra;
}
/**
* 设置扩展字段
*
* @param extra 扩展字段
* @return this
* @since 5.2.5
*/
public TreeNode<T> setExtra(Map<String, Object> extra) {
this.extra = extra;
return this;
}
}

View File

@ -64,24 +64,24 @@ public class TreeUtil {
* @return List
*/
public static <T, E> List<Tree<E>> build(List<T> list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser<T, E> nodeParser) {
final List<Tree<E>> treeNodes = CollUtil.newArrayList();
Tree<E> treeNode;
final List<Tree<E>> treeList = CollUtil.newArrayList();
Tree<E> tree;
for (T obj : list) {
treeNode = new Tree<>(treeNodeConfig);
nodeParser.parse(obj, treeNode);
treeNodes.add(treeNode);
tree = new Tree<>(treeNodeConfig);
nodeParser.parse(obj, tree);
treeList.add(tree);
}
List<Tree<E>> finalTreeNodes = CollUtil.newArrayList();
for (Tree<E> node : treeNodes) {
List<Tree<E>> finalTreeList = CollUtil.newArrayList();
for (Tree<E> node : treeList) {
if (parentId.equals(node.getParentId())) {
finalTreeNodes.add(node);
innerBuild(treeNodes, node, 0, treeNodeConfig.getDeep());
finalTreeList.add(node);
innerBuild(treeList, node, 0, treeNodeConfig.getDeep());
}
}
// 内存每层已经排过了 这是最外层排序
finalTreeNodes = finalTreeNodes.stream().sorted().collect(Collectors.toList());
return finalTreeNodes;
finalTreeList = finalTreeList.stream().sorted().collect(Collectors.toList());
return finalTreeList;
}
/**

View File

@ -2,6 +2,9 @@ package cn.hutool.core.lang.tree.parser;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.map.MapUtil;
import java.util.Map;
/**
* 默认的简单转换器
@ -12,14 +15,16 @@ import cn.hutool.core.lang.tree.Tree;
public class DefaultNodeParser<T> implements NodeParser<TreeNode<T>, T> {
@Override
public void parse(TreeNode<T> object, Tree<T> treeNode) {
treeNode.setId(object.getId());
treeNode.setParentId(object.getParentId());
treeNode.setWeight(object.getWeight());
treeNode.setName(object.getName());
public void parse(TreeNode<T> treeNode, Tree<T> tree) {
tree.setId(treeNode.getId());
tree.setParentId(treeNode.getParentId());
tree.setWeight(treeNode.getWeight());
tree.setName(treeNode.getName());
//扩展字段
// treeNode.extra("other",11);
// treeNode.extra("other2",object.getXXX);
final Map<String, Object> extra = treeNode.getExtra();
if(MapUtil.isNotEmpty(extra)){
extra.forEach(tree::putExtra);
}
}
}

View File

@ -4,6 +4,7 @@ import cn.hutool.core.annotation.Alias;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.map.MapUtil;
import lombok.Getter;
import lombok.Setter;
@ -150,8 +151,10 @@ public class BeanUtilTest {
person.setOpenid("11213232");
person.setName("测试A11");
person.setSubName("sub名字");
person.setSlow(true);
Map<String, Object> map = BeanUtil.beanToMap(person);
Console.log(map);
Assert.assertEquals("sub名字", map.get("aliasSubName"));
}
@ -299,9 +302,9 @@ public class BeanUtilTest {
@Getter
@Setter
public static class SubPersonWithAlias extends Person {
// boolean参数值非isXXX形式
@Alias("aliasSubName")
private String subName;
// boolean参数值非isXXX形式
private Boolean slow;
}

View File

@ -1,10 +1,6 @@
package cn.hutool.core.lang;
package cn.hutool.core.lang.tree;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import org.junit.Assert;
import org.junit.Test;
@ -33,13 +29,14 @@ public class TreeTest {
@Test
public void sampleTree() {
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0");
for (Tree<String> tree : treeNodes) {
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");
for (Tree<String> tree : treeList) {
Assert.assertNotNull(tree);
Assert.assertEquals("0", tree.getParentId());
}
// 测试通过子节点查找父节点
final Tree<String> rootNode0 = treeNodes.get(0);
final Tree<String> rootNode0 = treeList.get(0);
final Tree<String> parent = rootNode0.getChildren().get(0).getParent();
Assert.assertEquals(rootNode0, parent);
}