From 6ecf27a1cb97b395a0a35cdb28416ed02268db35 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Fri, 8 Oct 2021 18:36:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8A=BD=E5=8F=96"undefined"=E4=B8=BA?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=EF=BC=8C=E6=96=B0=E5=A2=9EisNullOrUndefinedS?= =?UTF-8?q?tr=E5=92=8CisBlankOrUndefined=E5=8F=96=E5=8F=8D=EF=BC=8C?= =?UTF-8?q?=E4=B8=BB=E8=A6=81=E7=94=A8=E4=BA=8Elambda=E5=8F=8C=E5=86=92?= =?UTF-8?q?=E5=8F=B7=E7=AE=80=E5=86=99=E5=9C=BA=E6=99=AF=E4=B8=8B=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=BF=99=E4=BF=A9=E5=87=BD=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E6=88=91=E5=B0=B1=E5=BE=97=E5=86=99=E7=AE=AD=E5=A4=B4=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BA=86=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/text/CharSequenceUtil.java | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 8c3974915..eef69acec 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -7,22 +7,12 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.Matcher; import cn.hutool.core.lang.func.Func1; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.DesensitizedUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ReUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; @@ -42,6 +32,11 @@ public class CharSequenceUtil { */ public static final String NULL = "null"; + /** + * 字符串常量:{@code "undefined"} + */ + public static final String UNDEFINED = "undefined"; + /** * 字符串常量:空字符串 {@code ""} */ @@ -494,6 +489,17 @@ public class CharSequenceUtil { return isNullOrUndefinedStr(str); } + /** + * 检查字符串是否不为null、空白串、“null”、“undefined” + * + * @param str 被检查的字符串 + * @return 是否不为null、空白串、“null”、“undefined” + * 不为null、空白串、“null”、“undefined”返回true,否则返回false + */ + public static boolean isNotBlankOrUndefined(CharSequence str) { + return !isBlankOrUndefined(str); + } + /** * 是否为“null”、“undefined”,不做空指针检查 * @@ -502,7 +508,18 @@ public class CharSequenceUtil { */ private static boolean isNullOrUndefinedStr(CharSequence str) { String strString = str.toString().trim(); - return NULL.equals(strString) || "undefined".equals(strString); + return NULL.equals(strString) || UNDEFINED.equals(strString); + } + + /** + * 是否不为“null”、“undefined”,不做空指针检查 + * + * @param str 字符串 + * @return 是否不为“null”、“undefined”,不为“null”、“undefined”返回true,否则false + */ + private static boolean isNotNullAndNotUndefinedStr(CharSequence str) { + String strString = str.toString().trim(); + return !NULL.equals(strString) && !UNDEFINED.equals(strString); } // ------------------------------------------------------------------------ Trim From 6a0bfb7994bb7fc15f800b5fedd2e39eb980cf02 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 30 Oct 2021 14:49:56 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=A2=9Epeeks=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E5=87=BD=E6=95=B0=E5=BC=8F=E7=BC=96=E7=A8=8B?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=A4=9A=E6=A0=B7=E6=80=A7=E5=92=8C=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E5=8F=AF=E8=83=BD=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/lang/Opt.java | 18 ++++++++++ .../java/cn/hutool/core/lang/OptTest.java | 34 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java index 9f3dac1da..2e197cd8a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java @@ -262,6 +262,24 @@ public class Opt { return this; } + + /** + * 如果包裹里元素的值存在,就执行对应的操作集,并返回本身 + * 如果不存在,返回一个空的{@code Opt} + * + *

属于 {@link #ifPresent}的链式拓展 + *

属于 {@link #peek(Consumer)}的动态拓展 + * + * @param actions 值存在时执行的操作,动态参数,可传入数组,当数组为空数组时并不会抛出 {@code NPE} + * @return this + * @throws NullPointerException 如果值存在,并且传入的操作为 {@code null} + * @author VampireAchao + */ + @SafeVarargs + public final Opt peeks(Consumer... actions) throws NullPointerException { + return Stream.of(actions).reduce(this, Opt::peek, (opts, opt) -> null); + } + /** * 如果包裹里元素的值存在,就返回本身,如果不存在,则使用传入的操作执行后获得的 {@code Opt} * diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java index 9c52e98fe..647b86882 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java @@ -9,6 +9,8 @@ import org.junit.Ignore; import org.junit.Test; import java.util.NoSuchElementException; +import java.util.function.Consumer; +import java.util.stream.Stream; /** * {@link Opt}的单元测试 @@ -63,6 +65,38 @@ public class OptTest { Assert.assertEquals("hutool", name); } + @Test + public void peeksTest() { + User user = new User(); + // 相当于上面peek的动态参数调用,更加灵活,你可以像操作数组一样去动态设置中间的步骤,也可以使用这种方式去编写你的代码 + // 可以一行搞定 + Opt.ofNullable("hutool").peeks(user::setUsername, user::setNickname, System.out::println); + // 也可以在适当的地方换行使得代码的可读性提高 + Opt.of(user).peeks( + u -> Assert.assertEquals("hutool", u.getNickname()), + u -> Assert.assertEquals("hutool", u.getUsername()) + ); + Assert.assertEquals("hutool", user.getNickname()); + Assert.assertEquals("hutool", user.getUsername()); + + // 注意,传入的lambda中,对包裹内的元素执行赋值操作并不会影响到原来的元素,这是java语言的特性。。。 + // 这也是为什么我们需要getter和setter而不直接给bean中的属性赋值中的其中一个原因 + String name = Opt.ofNullable("hutool").peeks(username -> username = "123", username -> username = "456", n -> Assert.assertEquals("hutool", n)).get(); + Assert.assertEquals("hutool", name); + + // 在控制台打印n次hutool + int n = 10; + @SuppressWarnings("unchecked") + Consumer[] actions = Stream.>generate(() -> System.out::println).limit(n).toArray(Consumer[]::new); + Opt.ofNullable("hutool").peeks(actions); + + // 当然,以下情况不会抛出NPE,但也没什么意义 + Opt.ofNullable("hutool").peeks().peeks().peeks(); + Opt.ofNullable(null).peeks(i -> { + }); + + } + @Test public void orTest() { // 这是jdk9 Optional中的新函数,直接照搬了过来 From d1a16d94ae6009f4f54bf66063a001525521d07c Mon Sep 17 00:00:00 2001 From: achao Date: Sat, 30 Oct 2021 14:53:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=96=B0=E5=A2=9Epeeks=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E5=87=BD=E6=95=B0=E5=BC=8F=E7=BC=96=E7=A8=8B?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=A4=9A=E6=A0=B7=E6=80=A7=E5=92=8C=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E5=8F=AF=E8=83=BD=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/lang/Opt.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java index 2e197cd8a..03439091f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java @@ -270,9 +270,9 @@ public class Opt { *

属于 {@link #ifPresent}的链式拓展 *

属于 {@link #peek(Consumer)}的动态拓展 * - * @param actions 值存在时执行的操作,动态参数,可传入数组,当数组为空数组时并不会抛出 {@code NPE} + * @param actions 值存在时执行的操作,动态参数,可传入数组,当数组为一个空数组时并不会抛出 {@code NPE} * @return this - * @throws NullPointerException 如果值存在,并且传入的操作为 {@code null} + * @throws NullPointerException 如果值存在,并且传入的操作集中的元素为 {@code null} * @author VampireAchao */ @SafeVarargs