From c1dc6db7320816f55dcd76c8535e0726f33473ec Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 16 Aug 2023 10:49:17 +0800 Subject: [PATCH] =?UTF-8?q?TreeUtil=E5=A2=9E=E5=8A=A0getParentsId=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/hutool/core/tree/TreeUtil.java | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/tree/TreeUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/TreeUtil.java index d9cc3432d..b540d1b5c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/tree/TreeUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/TreeUtil.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Function; /** * 树工具类 @@ -221,26 +222,7 @@ public class TreeUtil { * @since 5.2.4 */ public static List getParentsName(final MapTree node, final boolean includeCurrentNode) { - final List result = new ArrayList<>(); - if (null == node) { - return result; - } - - if (includeCurrentNode) { - result.add(node.getName()); - } - - MapTree parent = node.getParent(); - CharSequence name; - while (null != parent) { - name = parent.getName(); - parent = parent.getParent(); - if(null != name || null != parent){ - // issue#I795IN,根节点的null不加入 - result.add(name); - } - } - return result; + return getParents(node, includeCurrentNode, MapTree::getName); } /** @@ -256,24 +238,53 @@ public class TreeUtil { * @return 所有父节点ID列表,node为null返回空List * @since 5.8.22 */ - public static List getParentsId(MapTree node, boolean includeCurrentNode) { - final List result = new ArrayList<>(); + public static List getParentsId(final MapTree node, final boolean includeCurrentNode) { + return getParents(node, includeCurrentNode, MapTree::getId); + } + + /** + * 获取所有父节点指定函数结果列表 + * + * @param 节点ID类型 + * @param 字段值类型 + * @param node 节点 + * @param includeCurrentNode 是否包含当前节点的名称 + * @param fieldFunc 获取父节点名称的函数 + * @return 所有父节点字段值列表,node为null返回空List + * @since 6.0.0 + */ + public static List getParents(final MapTree node, final boolean includeCurrentNode, final Function, E> fieldFunc) { + final List result = new ArrayList<>(); if (null == node) { return result; } if (includeCurrentNode) { - result.add(node.getId()); + result.add(fieldFunc.apply(node)); } MapTree parent = node.getParent(); - T id; + E fieldValue; while (null != parent) { - id = parent.getId(); + fieldValue = fieldFunc.apply(parent); parent = parent.getParent(); + if(null != fieldValue || null != parent){ + // issue#I795IN,根节点的null不加入 + result.add(fieldValue); + } + } + return result; + } + + /** + * 获取所有父节点ID列表 + * + *

+ * 比如有个人在研发1部,他上面有研发部,接着上面有技术中心
+ parent = parent.getParent();) { if(null != id || null != parent){ // issue#I795IN,根节点的null不加入 - result.add(id); + result.add(fieldFunc.apply(parent)); } } return result;