From b92c91a1344f5678730f9e4f40db4a4239c90677 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 3 May 2023 22:15:11 +0800 Subject: [PATCH] fix code --- .../lang/hierarchy/HierarchyIterator.java | 221 ------------------ .../org/dromara/hutool/core/text/StrUtil.java | 12 + .../tree/hierarchy/HierarchyIterator.java | 68 ++++++ .../tree/hierarchy/HierarchyIteratorImpl.java | 80 +++++++ .../tree/hierarchy/HierarchyIteratorUtil.java | 133 +++++++++++ .../hierarchy/HierarchyUtil.java | 14 +- .../core/tree/hierarchy/package-info.java | 19 ++ .../hierarchy/HierarchyUtilTest.java | 44 ++-- 8 files changed, 349 insertions(+), 242 deletions(-) delete mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyIterator.java create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIterator.java create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorImpl.java create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorUtil.java rename hutool-core/src/main/java/org/dromara/hutool/core/{lang => tree}/hierarchy/HierarchyUtil.java (89%) create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/package-info.java rename hutool-core/src/test/java/org/dromara/hutool/core/{lang => tree}/hierarchy/HierarchyUtilTest.java (67%) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyIterator.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyIterator.java deleted file mode 100644 index e8d6c054e..000000000 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyIterator.java +++ /dev/null @@ -1,221 +0,0 @@ -package org.dromara.hutool.core.lang.hierarchy; - -import org.dromara.hutool.core.lang.mutable.Mutable; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; - -/** - * 用于遍历层级结构的迭代器,提供了遍历过程中的回调方法: - * - * - *

默认提供了三类{@link HierarchyIterator}实现: - *

- * 可以实现自定义的{@link HierarchyIterator}来支持更多的遍历模式。 - * - * @param 层级类型 - * @param 结果类型 - * @author huangchengxing - * @since 6.0.0 - */ -@FunctionalInterface -public interface HierarchyIterator { - - /** - * 获取下一层级 - * - * @param result 结果 - * @param hierarchy 当前层级 - * @return 向容器中添加元素的方法 - */ - Collection nextHierarchies(R result, H hierarchy); - - /** - * 是否中断遍历 - * - * @param hierarchy 当前层级 - * @return 是否中断遍历 - */ - default boolean isBreak(H hierarchy) { - return false; - } - - /** - * 获取结果 - * - * @return 结果 - */ - default R getResult() { - return null; - } - - /** - * 创建一个{@link HierarchyIterator}对象, 当{@code finder}返回非空时, 迭代器立刻中断, 返回结果 - * - * @param function 迭代器处理函数 - * @param finder 查找器 - * @param 层级结构类型 - * @param 迭代器结果类型 - * @return {@link HierarchyIterator} - */ - static HierarchyIterator find( - final Function> function, final Function finder) { - Objects.requireNonNull(function); - Objects.requireNonNull(finder); - final Mutable mutable = Mutable.of(null); - final Predicate terminator = h -> { - R r = finder.apply(h); - if (r != null) { - mutable.set(r); - return true; - } - return false; - }; - return new HierarchyIteratorImpl<>(mutable::get, terminator, (r, h) -> function.apply(h)); - } - - /** - * 创建一个{@link HierarchyIterator}对象, 迭代器结果总是为{@code null} - * - * @param function 迭代器处理函数 - * @param terminator 是否终止遍历 - * @param 层级结构类型 - * @return {@link HierarchyIterator} - */ - static HierarchyIterator scan( - final Function> function, final Predicate terminator) { - Objects.requireNonNull(function); - return new HierarchyIteratorImpl<>(() -> null, terminator, (r, h) -> function.apply(h)); - } - - /** - * 创建一个{@link HierarchyIterator}对象, 迭代器结果总是为{@code null} - * - * @param function 迭代器处理函数 - * @param 层级结构类型 - * @return {@link HierarchyIterator} - */ - static HierarchyIterator scan(final Function> function) { - return scan(function, h -> false); - } - - /** - * 创建一个{@link HierarchyIterator}对象, 若{@code mapper}返回非空, 则将结果添加到集合中,最终返回集合 - * - * @param function 迭代器处理函数 - * @param collFactory 集合工厂 - * @param mapper 迭代器结果映射函数 - * @param 层级结构类型 - * @param 迭代器结果类型 - * @param 集合类型 - * @return {@link HierarchyIterator} - */ - static > HierarchyIterator collect( - final Function> function, final Supplier collFactory, final Function mapper) { - Objects.requireNonNull(function); - Objects.requireNonNull(collFactory); - Objects.requireNonNull(mapper); - final C collection = collFactory.get(); - return new HierarchyIteratorImpl<>(() -> collection, h -> false, (r, h) -> { - final R apply = mapper.apply(h); - if (Objects.nonNull(apply)) { - collection.add(apply); - } - return function.apply(h); - }); - } - - /** - * 创建一个{@link HierarchyIterator}对象, 若{@code mapper}返回非空, 则将结果添加到集合中,最终返回集合 - * - * @param function 迭代器处理函数 - * @param mapper 迭代器结果映射函数 - * @param 层级结构类型 - * @param 迭代器结果类型 - * @return {@link HierarchyIterator} - */ - static HierarchyIterator> collect( - final Function> function, final Function mapper) { - return collect(function, ArrayList::new, mapper); - } - - /** - * 创建一个{@link HierarchyIterator}对象, 则将非空结果添加到集合中,最终返回集合 - * - * @param function 迭代器处理函数 - * @param 层级结构类型 - * @return {@link HierarchyIterator} - */ - static HierarchyIterator> collect( - final Function> function) { - return collect(function, Function.identity()); - } - - /** - * {@link HierarchyIterator}的基本实现。 - * - * @param 层级类型 - * @param 结果类型 - */ - class HierarchyIteratorImpl implements HierarchyIterator { - - private final Supplier resultFactory; - private final Predicate hierarchyFilter; - private final BiFunction> hierarchyFinder; - - public HierarchyIteratorImpl( - final Supplier resultFactory, final Predicate hierarchyFilter, - final BiFunction> hierarchyFinder) { - this.resultFactory = resultFactory; - this.hierarchyFilter = hierarchyFilter; - this.hierarchyFinder = hierarchyFinder; - } - - /** - * 获取下一层级 - * - * @param result 结果 - * @param hierarchy 当前层级 - * @return 向容器中添加元素的方法 - */ - @Override - public Collection nextHierarchies(final R result, final H hierarchy) { - return hierarchyFinder.apply(result, hierarchy); - } - - /** - * 是否中断遍历 - * - * @param hierarchy 当前层级 - * @return 是否中断遍历 - */ - @Override - public boolean isBreak(final H hierarchy) { - return hierarchyFilter.test(hierarchy); - } - - /** - * 获取结果 - * - * @return 结果 - */ - @Override - public R getResult() { - return resultFactory.get(); - } - } -} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java index b44a0cbdb..9973b2607 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java @@ -13,6 +13,7 @@ package org.dromara.hutool.core.text; import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.func.FunctionPool; import org.dromara.hutool.core.text.placeholder.StrFormatter; import org.dromara.hutool.core.util.CharsetUtil; @@ -219,6 +220,17 @@ public class StrUtil extends CharSequenceUtil implements StrPool { } return charset.decode(data).toString(); } + + /** + * JDK8中,通过{@code String(char[] value, boolean share)}这个内部构造创建String对象。
+ * 此函数通过传入char[],实现zero-copy的String创建,效率很高。但是要求传入的char[]不可以在其他地方修改。 + * + * @param value char[]值,注意这个数组不可修改!! + * @return String + */ + public static String strFast(final char[] value){ + return FunctionPool.createString(value); + } // endregion /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIterator.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIterator.java new file mode 100644 index 000000000..0d7b41bad --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIterator.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.tree.hierarchy; + +import java.util.Collection; + +/** + * 用于遍历层级结构的迭代器,提供了遍历过程中的回调方法: + *
    + *
  • {@link #isBreak}: 是否中断遍历,其在{@link #nextHierarchies}之前调用;
  • + *
  • {@link #nextHierarchies}: 获得下一需要遍历的层级,当为空时结束;
  • + *
  • {@link #getResult}: 当遍历完成后,获取迭代器结果;
  • + *
+ * + *

默认提供了三类{@code HierarchyIterator}实现: + *

    + *
  • scan: 遍历所有的层级结构;
  • + *
  • collector: 收集层级结构中所有符合条件的结果,并在结束遍历后返回所有结果;
  • + *
  • find: 找到层级结构中符合条件的结果后立刻中断遍历,并返回该结果;
  • + *
+ * 可以实现自定义的{@code HierarchyIterator}来支持更多的遍历模式。 + * + * @param 层级类型 + * @param 结果类型 + * @author huangchengxing + * @since 6.0.0 + */ +@FunctionalInterface +public interface HierarchyIterator { + + /** + * 获取下一层级 + * + * @param result 结果 + * @param hierarchy 当前层级 + * @return 向容器中添加元素的方法 + */ + Collection nextHierarchies(R result, H hierarchy); + + /** + * 是否中断遍历 + * + * @param hierarchy 当前层级 + * @return 是否中断遍历 + */ + default boolean isBreak(final H hierarchy) { + return false; + } + + /** + * 获取结果 + * + * @return 结果 + */ + default R getResult() { + return null; + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorImpl.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorImpl.java new file mode 100644 index 000000000..0362e0e9d --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorImpl.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.tree.hierarchy; + +import java.util.Collection; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * {@code HierarchyIterator}的基本实现。 + * + * @param 层级类型 + * @param 结果类型 + * @author huangchengxing + */ +public class HierarchyIteratorImpl implements HierarchyIterator { + + private final Supplier resultFactory; + private final Predicate hierarchyFilter; + private final BiFunction> hierarchyFinder; + + /** + * 构造 + * + * @param resultFactory 结果创建类 + * @param hierarchyFilter 层级过滤器 + * @param hierarchyFinder 层级查找器 + */ + public HierarchyIteratorImpl( + final Supplier resultFactory, final Predicate hierarchyFilter, + final BiFunction> hierarchyFinder) { + this.resultFactory = resultFactory; + this.hierarchyFilter = hierarchyFilter; + this.hierarchyFinder = hierarchyFinder; + } + + /** + * 获取下一层级 + * + * @param result 结果 + * @param hierarchy 当前层级 + * @return 向容器中添加元素的方法 + */ + @Override + public Collection nextHierarchies(final R result, final H hierarchy) { + return hierarchyFinder.apply(result, hierarchy); + } + + /** + * 是否中断遍历 + * + * @param hierarchy 当前层级 + * @return 是否中断遍历 + */ + @Override + public boolean isBreak(final H hierarchy) { + return hierarchyFilter.test(hierarchy); + } + + /** + * 获取结果 + * + * @return 结果 + */ + @Override + public R getResult() { + return resultFactory.get(); + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorUtil.java new file mode 100644 index 000000000..10b832596 --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyIteratorUtil.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.tree.hierarchy; + +import org.dromara.hutool.core.lang.mutable.Mutable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * {@link HierarchyIterator}创建工具类 + * + * @author huangchengxing + * @since 6.0.0 + */ +public class HierarchyIteratorUtil { + /** + * 创建一个{@code HierarchyIterator}对象, 当{@code finder}返回非空时, 迭代器立刻中断, 返回结果 + * + * @param function 迭代器处理函数 + * @param finder 查找器 + * @param 层级结构类型 + * @param 迭代器结果类型 + * @return {@code HierarchyIterator} + */ + public static HierarchyIterator find( + final Function> function, final Function finder) { + Objects.requireNonNull(function); + Objects.requireNonNull(finder); + final Mutable mutable = Mutable.of(null); + final Predicate terminator = h -> { + final R r = finder.apply(h); + if (r != null) { + mutable.set(r); + return true; + } + return false; + }; + return new HierarchyIteratorImpl<>(mutable::get, terminator, (r, h) -> function.apply(h)); + } + + /** + * 创建一个{@code HierarchyIterator}对象, 迭代器结果总是为{@code null} + * + * @param function 迭代器处理函数 + * @param terminator 是否终止遍历 + * @param 层级结构类型 + * @return {@code HierarchyIterator} + */ + public static HierarchyIterator scan( + final Function> function, final Predicate terminator) { + Objects.requireNonNull(function); + return new HierarchyIteratorImpl<>(() -> null, terminator, (r, h) -> function.apply(h)); + } + + /** + * 创建一个{@code HierarchyIterator}对象, 迭代器结果总是为{@code null} + * + * @param function 迭代器处理函数 + * @param 层级结构类型 + * @return {@code HierarchyIterator} + */ + public static HierarchyIterator scan(final Function> function) { + return scan(function, h -> false); + } + + /** + * 创建一个{@code HierarchyIterator}对象, 若{@code mapper}返回非空, 则将结果添加到集合中,最终返回集合 + * + * @param function 迭代器处理函数 + * @param collFactory 集合工厂 + * @param mapper 迭代器结果映射函数 + * @param 层级结构类型 + * @param 迭代器结果类型 + * @param 集合类型 + * @return {@code HierarchyIterator} + */ + public static > HierarchyIterator collect( + final Function> function, final Supplier collFactory, final Function mapper) { + Objects.requireNonNull(function); + Objects.requireNonNull(collFactory); + Objects.requireNonNull(mapper); + final C collection = collFactory.get(); + return new HierarchyIteratorImpl<>(() -> collection, h -> false, (r, h) -> { + final R apply = mapper.apply(h); + if (Objects.nonNull(apply)) { + collection.add(apply); + } + return function.apply(h); + }); + } + + /** + * 创建一个{@code HierarchyIterator}对象, 若{@code mapper}返回非空, 则将结果添加到集合中,最终返回集合 + * + * @param function 迭代器处理函数 + * @param mapper 迭代器结果映射函数 + * @param 层级结构类型 + * @param 迭代器结果类型 + * @return {@code HierarchyIterator} + */ + public static HierarchyIterator> collect( + final Function> function, final Function mapper) { + return collect(function, ArrayList::new, mapper); + } + + /** + * 创建一个{@code HierarchyIterator}对象, 则将非空结果添加到集合中,最终返回集合 + * + * @param function 迭代器处理函数 + * @param 层级结构类型 + * @return {@code HierarchyIterator} + */ + public static HierarchyIterator> collect( + final Function> function) { + return collect(function, Function.identity()); + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtil.java similarity index 89% rename from hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtil.java rename to hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtil.java index 77abe2cfd..4e3a15561 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtil.java @@ -1,4 +1,16 @@ -package org.dromara.hutool.core.lang.hierarchy; +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.tree.hierarchy; import org.dromara.hutool.core.collection.CollUtil; diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/package-info.java b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/package-info.java new file mode 100644 index 000000000..1bb015dbb --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/tree/hierarchy/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * 用于处理层级结构的通用工具列,结构类似 Stream + Collector。
+ * HierarchyUtil 提供深度优先和广度优先算法实现,HierarchyIterator 则提供具体的操作逻辑 + * + * @author huangchengxing + */ +package org.dromara.hutool.core.tree.hierarchy; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtilTest.java similarity index 67% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtilTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtilTest.java index acdd5ca1f..262b11f00 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/hierarchy/HierarchyUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/tree/hierarchy/HierarchyUtilTest.java @@ -1,18 +1,22 @@ -package org.dromara.hutool.core.lang.hierarchy; +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.tree.hierarchy; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -54,8 +58,8 @@ class HierarchyUtilTest { @Test void testTraverseByBreadthFirst() { // 按广度优先遍历所有节点 - Set nodes = new LinkedHashSet<>(); - HierarchyUtil.traverseByBreadthFirst("0", HierarchyIterator.scan(t -> { + final Set nodes = new LinkedHashSet<>(); + HierarchyUtil.traverseByBreadthFirst("0", HierarchyIteratorUtil.scan(t -> { nodes.add(t); return tree.entrySet().stream() .filter(e -> Objects.equals(t, e.getValue())) @@ -69,14 +73,14 @@ class HierarchyUtilTest { ); // 按广度优先寻找 0-2-3 - String target = HierarchyUtil.traverseByBreadthFirst("0", HierarchyIterator.find(parentFinder(), + final String target = HierarchyUtil.traverseByBreadthFirst("0", HierarchyIteratorUtil.find(parentFinder(), t -> Objects.equals(t, "0-2-3") ? t : null )); Assertions.assertEquals("0-2-3", target); // 按广度优先获取 0-2 的所有子节点 - List children = HierarchyUtil.traverseByBreadthFirst( - "0", HierarchyIterator.collect(parentFinder(), + final List children = HierarchyUtil.traverseByBreadthFirst( + "0", HierarchyIteratorUtil.collect(parentFinder(), t -> Objects.equals(tree.get(t), "0-2") ? t : null ) ); @@ -87,8 +91,8 @@ class HierarchyUtilTest { @Test void testTraverseByDepthFirst() { // 按深度优先遍历所有节点 - Set nodes = new LinkedHashSet<>(); - HierarchyUtil.traverseByDepthFirst("0", HierarchyIterator.scan(t -> { + final Set nodes = new LinkedHashSet<>(); + HierarchyUtil.traverseByDepthFirst("0", HierarchyIteratorUtil.scan(t -> { nodes.add(t); return tree.entrySet().stream() .filter(e -> Objects.equals(t, e.getValue())) @@ -102,14 +106,14 @@ class HierarchyUtilTest { ); // 按深度优先寻找 0-2-3 - String target = HierarchyUtil.traverseByDepthFirst("0", HierarchyIterator.find(parentFinder(), + final String target = HierarchyUtil.traverseByDepthFirst("0", HierarchyIteratorUtil.find(parentFinder(), t -> Objects.equals(t, "0-2-3") ? t : null )); Assertions.assertEquals("0-2-3", target); // 按深度优先获取 0-2 的所有子节点 - List children = HierarchyUtil.traverseByDepthFirst( - "0", HierarchyIterator.collect(parentFinder(), + final List children = HierarchyUtil.traverseByDepthFirst( + "0", HierarchyIteratorUtil.collect(parentFinder(), t -> Objects.equals(tree.get(t), "0-2") ? t : null ) );