diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java index 76272e9bc..34775f92d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java @@ -215,7 +215,7 @@ public class Tree extends LinkedHashMap implements Node { /** * 递归过滤当前树,注意此方法会修改当前树
- * 通过{@link Filter}指定的过滤规则,本节点或子节点满足过滤条件,则保留当前节点,否则抛弃节点及其子节点 + * 通过{@link Filter}指定的过滤规则,本节点或子节点满足过滤条件,则保留当前节点及其所有子节点,否则抛弃节点及其子节点 * * @param filter 节点过滤规则函数,只需处理本级节点本身即可 * @return 过滤后的节点,{@code null} 表示不满足过滤要求,丢弃之 @@ -223,6 +223,11 @@ public class Tree extends LinkedHashMap implements Node { * @since 5.7.17 */ public Tree filter(Filter> filter) { + if(filter.accept(this)){ + // 本节点满足,则包括所有子节点都保留 + return this; + } + final List> children = getChildren(); if (CollUtil.isNotEmpty(children)) { // 递归过滤子节点 @@ -243,7 +248,7 @@ public class Tree extends LinkedHashMap implements Node { } // 子节点都不符合过滤条件,检查本节点 - return filter.accept(this) ? this : null; + return null; } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java index c695a707c..73083aefc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.lang.tree; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Test; @@ -109,12 +110,12 @@ public class TreeTest { // 经过过滤,生成新的树 Tree newTree = tree.filterNew((t)->{ final CharSequence name = t.getName(); - return null != name && name.toString().contains("管理"); + return null != name && name.toString().contains("店铺"); }); List ids = new ArrayList<>(); newTree.walk((tr)-> ids.add(tr.getId())); - Assert .assertEquals(6, ids.size()); + Assert .assertEquals(4, ids.size()); List ids2 = new ArrayList<>(); tree.walk((tr)-> ids2.add(tr.getId()));