diff --git a/CHANGELOG.md b/CHANGELOG.md index a430af01f..80eb45a5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ * 【core 】 DateUtil增加rangeToList重载(pr#1925@Github) * 【core 】 CollUtil增加safeContains方法(pr#1926@Github) * 【core 】 ActualTypeMapperPool增加getStrKeyMap方法(pr#447@Gitee) +* 【core 】 TreeUtil增加walk方法(pr#1932@Gitee) ### 🐞Bug修复 * 【core 】 修复UrlBuilder.addPath歧义问题(issue#1912@Github) 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 269f0650b..85801c438 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 @@ -12,6 +12,7 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.function.Consumer; /** * 通过转换器将你的实体转化为TreeNodeMap节点实体 属性都存在此处,属性有序,可支持排序 @@ -174,6 +175,20 @@ import java.util.List; return (List>) this.get(treeNodeConfig.getChildrenKey()); } + /** + * 递归树并处理子树下的节点: + * + * @param consumer 节点处理器 + * @since 5.7.16 + */ + public void walk(Consumer> consumer) { + consumer.accept(this); + final List> children = getChildren(); + if(CollUtil.isNotEmpty(children)){ + children.forEach((tree)-> tree.walk(consumer)); + } + } + /** * 设置子节点,设置后会覆盖所有原有子节点 * 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 233195bf0..3007991cf 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 @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; import java.util.List; /** @@ -66,4 +67,13 @@ public class TreeTest { Assert.assertEquals(treeNodes.size(), 2); } + + @Test + public void walkTest(){ + List ids = new ArrayList<>(); + final Tree tree = TreeUtil.buildSingle(nodeList, "0"); + tree.walk((tr)-> ids.add(tr.getId())); + + Assert .assertEquals(7, ids.size()); + } } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java index 6002bf471..b026cdd3c 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java @@ -44,7 +44,7 @@ import java.util.TimeZone; * 注意: * *
- * 当isMatchSecond为true时才会匹配秒部分
+ * 当isMatchSecond为{@code true}时才会匹配秒部分
  * 默认都是关闭的
  * 
* @@ -124,7 +124,7 @@ public class CronPattern { * * @param millis 时间毫秒数 * @param isMatchSecond 是否匹配秒 - * @return 如果匹配返回 true, 否则返回 false + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} */ public boolean match(long millis, boolean isMatchSecond) { return match(TimeZone.getDefault(), millis, isMatchSecond); @@ -136,7 +136,7 @@ public class CronPattern { * @param timezone 时区 {@link TimeZone} * @param millis 时间毫秒数 * @param isMatchSecond 是否匹配秒 - * @return 如果匹配返回 true, 否则返回 false + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} */ public boolean match(TimeZone timezone, long millis, boolean isMatchSecond) { final GregorianCalendar calendar = new GregorianCalendar(timezone); @@ -149,7 +149,7 @@ public class CronPattern { * * @param calendar 时间 * @param isMatchSecond 是否匹配秒 - * @return 如果匹配返回 true, 否则返回 false + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} */ public boolean match(GregorianCalendar calendar, boolean isMatchSecond) { final int second = calendar.get(Calendar.SECOND); diff --git a/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java b/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java index 6efdb28e6..bd77a8e2b 100644 --- a/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java +++ b/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java @@ -1,13 +1,14 @@ package cn.hutool.cron.pattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.cron.CronException; import org.junit.Assert; import org.junit.Test; /** * 定时任务单元测试类 - * + * * @author Looly * */ @@ -18,10 +19,11 @@ public class CronPatternTest { CronPattern pattern; // 任何时间匹配 pattern = new CronPattern("* * * * * *"); + ThreadUtil.sleep(600); Assert.assertTrue(pattern.match(DateUtil.current(), true)); Assert.assertTrue(pattern.match(DateUtil.current(), false)); } - + @Test public void matchAllTest2() { // 在5位表达式中,秒部分并不是任意匹配,而是一个固定值 @@ -88,14 +90,14 @@ public class CronPatternTest { assertMatch(pattern, "2017-02-09 00:00:39"); } - + @SuppressWarnings("ConstantConditions") @Test public void CronPatternTest2() { CronPattern pattern = new CronPattern("0/30 * * * *"); Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:00:00").getTime(), false)); Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:30:00").getTime(), false)); - + pattern = new CronPattern("32 * * * *"); Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:32:00").getTime(), false)); } @@ -144,12 +146,12 @@ public class CronPatternTest { @Test(expected = CronException.class) public void rangeYearTest() { // year的范围是1970~2099年,超出报错 - CronPattern pattern = new CronPattern("0/1 * * * 1/1 ? 2020-2120"); + new CronPattern("0/1 * * * 1/1 ? 2020-2120"); } /** * 表达式是否匹配日期 - * + * * @param pattern 表达式 * @param date 日期,标准日期时间字符串 */