This commit is contained in:
Looly 2021-12-05 23:34:14 +08:00
parent 1ee2d5d257
commit 3fefdf5151
2 changed files with 10 additions and 4 deletions

View File

@ -215,7 +215,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
/** /**
* 递归过滤当前树注意此方法会修改当前树<br> * 递归过滤当前树注意此方法会修改当前树<br>
* 通过{@link Filter}指定的过滤规则本节点或子节点满足过滤条件则保留当前节点否则抛弃节点及其子节点 * 通过{@link Filter}指定的过滤规则本节点或子节点满足过滤条件则保留当前节点及其所有子节点否则抛弃节点及其子节点
* *
* @param filter 节点过滤规则函数只需处理本级节点本身即可 * @param filter 节点过滤规则函数只需处理本级节点本身即可
* @return 过滤后的节点{@code null} 表示不满足过滤要求丢弃之 * @return 过滤后的节点{@code null} 表示不满足过滤要求丢弃之
@ -223,6 +223,11 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @since 5.7.17 * @since 5.7.17
*/ */
public Tree<T> filter(Filter<Tree<T>> filter) { public Tree<T> filter(Filter<Tree<T>> filter) {
if(filter.accept(this)){
// 本节点满足则包括所有子节点都保留
return this;
}
final List<Tree<T>> children = getChildren(); final List<Tree<T>> children = getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
// 递归过滤子节点 // 递归过滤子节点
@ -243,7 +248,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
} }
// 子节点都不符合过滤条件检查本节点 // 子节点都不符合过滤条件检查本节点
return filter.accept(this) ? this : null; return null;
} }
/** /**

View File

@ -1,6 +1,7 @@
package cn.hutool.core.lang.tree; package cn.hutool.core.lang.tree;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
@ -109,12 +110,12 @@ public class TreeTest {
// 经过过滤生成新的树 // 经过过滤生成新的树
Tree<String> newTree = tree.filterNew((t)->{ Tree<String> newTree = tree.filterNew((t)->{
final CharSequence name = t.getName(); final CharSequence name = t.getName();
return null != name && name.toString().contains("管理"); return null != name && name.toString().contains("店铺");
}); });
List<String> ids = new ArrayList<>(); List<String> ids = new ArrayList<>();
newTree.walk((tr)-> ids.add(tr.getId())); newTree.walk((tr)-> ids.add(tr.getId()));
Assert .assertEquals(6, ids.size()); Assert .assertEquals(4, ids.size());
List<String> ids2 = new ArrayList<>(); List<String> ids2 = new ArrayList<>();
tree.walk((tr)-> ids2.add(tr.getId())); tree.walk((tr)-> ids2.add(tr.getId()));