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; package cn.hutool.core.lang.tree;
import java.util.Map;
/** /**
* 树节点 每个属性都可以在{@link TreeNodeConfig}中被重命名<br> * 树节点 每个属性都可以在{@link TreeNodeConfig}中被重命名<br>
* 在你的项目里它可以是部门实体地区实体等任意类树节点实体 * 在你的项目里它可以是部门实体地区实体等任意类树节点实体
@ -31,6 +33,11 @@ public class TreeNode<T> implements Node<T> {
*/ */
private Comparable<?> weight = 0; private Comparable<?> weight = 0;
/**
* 扩展字段
*/
private Map<String, Object> extra;
/** /**
* 空构造 * 空构造
@ -99,4 +106,26 @@ public class TreeNode<T> implements Node<T> {
this.weight = weight; this.weight = weight;
return this; 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 * @return List
*/ */
public static <T, E> List<Tree<E>> build(List<T> list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser<T, E> nodeParser) { 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(); final List<Tree<E>> treeList = CollUtil.newArrayList();
Tree<E> treeNode; Tree<E> tree;
for (T obj : list) { for (T obj : list) {
treeNode = new Tree<>(treeNodeConfig); tree = new Tree<>(treeNodeConfig);
nodeParser.parse(obj, treeNode); nodeParser.parse(obj, tree);
treeNodes.add(treeNode); treeList.add(tree);
} }
List<Tree<E>> finalTreeNodes = CollUtil.newArrayList(); List<Tree<E>> finalTreeList = CollUtil.newArrayList();
for (Tree<E> node : treeNodes) { for (Tree<E> node : treeList) {
if (parentId.equals(node.getParentId())) { if (parentId.equals(node.getParentId())) {
finalTreeNodes.add(node); finalTreeList.add(node);
innerBuild(treeNodes, node, 0, treeNodeConfig.getDeep()); innerBuild(treeList, node, 0, treeNodeConfig.getDeep());
} }
} }
// 内存每层已经排过了 这是最外层排序 // 内存每层已经排过了 这是最外层排序
finalTreeNodes = finalTreeNodes.stream().sorted().collect(Collectors.toList()); finalTreeList = finalTreeList.stream().sorted().collect(Collectors.toList());
return finalTreeNodes; 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.TreeNode;
import cn.hutool.core.lang.tree.Tree; 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> { public class DefaultNodeParser<T> implements NodeParser<TreeNode<T>, T> {
@Override @Override
public void parse(TreeNode<T> object, Tree<T> treeNode) { public void parse(TreeNode<T> treeNode, Tree<T> tree) {
treeNode.setId(object.getId()); tree.setId(treeNode.getId());
treeNode.setParentId(object.getParentId()); tree.setParentId(treeNode.getParentId());
treeNode.setWeight(object.getWeight()); tree.setWeight(treeNode.getWeight());
treeNode.setName(object.getName()); tree.setName(treeNode.getName());
//扩展字段 //扩展字段
// treeNode.extra("other",11); final Map<String, Object> extra = treeNode.getExtra();
// treeNode.extra("other2",object.getXXX); 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.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -150,8 +151,10 @@ public class BeanUtilTest {
person.setOpenid("11213232"); person.setOpenid("11213232");
person.setName("测试A11"); person.setName("测试A11");
person.setSubName("sub名字"); person.setSubName("sub名字");
person.setSlow(true);
Map<String, Object> map = BeanUtil.beanToMap(person); Map<String, Object> map = BeanUtil.beanToMap(person);
Console.log(map);
Assert.assertEquals("sub名字", map.get("aliasSubName")); Assert.assertEquals("sub名字", map.get("aliasSubName"));
} }
@ -299,9 +302,9 @@ public class BeanUtilTest {
@Getter @Getter
@Setter @Setter
public static class SubPersonWithAlias extends Person { public static class SubPersonWithAlias extends Person {
// boolean参数值非isXXX形式
@Alias("aliasSubName") @Alias("aliasSubName")
private String subName; private String subName;
// boolean参数值非isXXX形式
private Boolean slow; 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.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.Assert;
import org.junit.Test; import org.junit.Test;
@ -33,13 +29,14 @@ public class TreeTest {
@Test @Test
public void sampleTree() { public void sampleTree() {
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0"); List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");
for (Tree<String> tree : treeNodes) { for (Tree<String> tree : treeList) {
Assert.assertNotNull(tree); 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(); final Tree<String> parent = rootNode0.getChildren().get(0).getParent();
Assert.assertEquals(rootNode0, parent); Assert.assertEquals(rootNode0, parent);
} }