diff --git a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java index 111435a3c..2fa21fe18 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java @@ -90,17 +90,39 @@ public interface ForestMap extends Map> { * @param values 要添加的值 * @param keyGenerator 从值中获取key的方法 * @param parentKeyGenerator 从值中获取父节点key的方法 + * @param ignoreNullNode 是否获取到的key为null的子节点/父节点 */ default > void putAllNode( - C values, Function keyGenerator, Function parentKeyGenerator) { + C values, Function keyGenerator, Function parentKeyGenerator, boolean ignoreNullNode) { if (CollUtil.isEmpty(values)) { return; } values.forEach(v -> { final K key = keyGenerator.apply(v); final K parentKey = parentKeyGenerator.apply(v); - linkNodes(parentKey, key); - get(key).setValue(v); + + // 不忽略keu为null节点 + boolean hasKey = ObjectUtil.isNotNull(key); + boolean hasParentKey = ObjectUtil.isNotNull(parentKey); + if (!ignoreNullNode || (hasKey && hasParentKey)) { + linkNodes(parentKey, key); + get(key).setValue(v); + return; + } + + // 父子节点的key都为null + if (!hasKey && !hasParentKey) { + return; + } + + // 父节点key为null + if (hasKey) { + putNode(key, v); + return; + } + + // 子节点key为null + putNode(parentKey, null); }); } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/TreeEntry.java b/hutool-core/src/main/java/cn/hutool/core/map/TreeEntry.java index 3c64448c3..a85856873 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/TreeEntry.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/TreeEntry.java @@ -89,6 +89,8 @@ public interface TreeEntry extends Map.Entry { return ObjectUtil.isNotNull(getParent(key)); } + // ===================== 子节点相关方法 ===================== + /** * 获取以当前节点作为根节点的树结构,然后遍历所有节点 * @@ -97,8 +99,6 @@ public interface TreeEntry extends Map.Entry { */ void forEachChild(boolean includeSelf, Consumer> nodeConsumer); - // ===================== 子节点相关方法 ===================== - /** * 获取当前节点直接关联的子节点 *