From e327458eb6c7350f0e7e9e50a0802c542400e4e1 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Tue, 28 Jun 2022 14:56:35 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix=20ConcurrencyTester=20thread=20size?= =?UTF-8?q?=20too=20large,=20=E5=8F=AF=E8=83=BD=E4=BC=9A=20java.lang.OutOf?= =?UTF-8?q?MemoryError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/cn/hutool/core/lang/SimpleCacheTest.java | 2 +- .../src/test/java/cn/hutool/core/map/WeakConcurrentMapTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java index ff0087074..198f09c4b 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java @@ -57,7 +57,7 @@ public class SimpleCacheTest { @Test public void getConcurrencyTest(){ final SimpleCache cache = new SimpleCache<>(); - final ConcurrencyTester tester = new ConcurrencyTester(9000); + final ConcurrencyTester tester = new ConcurrencyTester(2000); tester.test(()-> cache.get("aaa", ()-> { ThreadUtil.sleep(200); return "aaaValue"; diff --git a/hutool-core/src/test/java/cn/hutool/core/map/WeakConcurrentMapTest.java b/hutool-core/src/test/java/cn/hutool/core/map/WeakConcurrentMapTest.java index d2aab2848..d0670794a 100755 --- a/hutool-core/src/test/java/cn/hutool/core/map/WeakConcurrentMapTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/WeakConcurrentMapTest.java @@ -46,7 +46,7 @@ public class WeakConcurrentMapTest { @Test public void getConcurrencyTest(){ final WeakConcurrentMap cache = new WeakConcurrentMap<>(); - final ConcurrencyTester tester = new ConcurrencyTester(9000); + final ConcurrencyTester tester = new ConcurrencyTester(2000); tester.test(()-> cache.computeIfAbsent("aaa" + RandomUtil.randomInt(2), (key)-> "aaaValue")); Assert.assertTrue(tester.getInterval() > 0); From f0707cee77a6a53bbc23ecaf1d9b3fafccee9261 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Tue, 28 Jun 2022 17:02:51 +0800 Subject: [PATCH 02/10] add isAllBlank(final Collection strs) --- .../java/cn/hutool/core/text/StrUtil.java | 21 +++++++++ .../java/cn/hutool/core/text/StrUtilTest.java | 45 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java index b3e63f3da..2b520bceb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java @@ -7,6 +7,9 @@ import java.io.StringReader; import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; import java.util.Map; /** @@ -415,4 +418,22 @@ public class StrUtil extends CharSequenceUtil implements StrPool { public static String format(final CharSequence template, final Map map, final boolean ignoreNull) { return StrFormatter.format(template, map, ignoreNull); } + + /** + * @see CharSequenceUtil#isAllBlank(CharSequence...) + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @since 6.0.1 + */ + public static boolean isAllBlank(final Collection strs) { + if (ArrayUtil.isEmpty(strs)) { + return true; + } + for (final CharSequence str : strs) { + if (isNotBlank(str)) { + return false; + } + } + return true; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java new file mode 100644 index 000000000..20b23d523 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -0,0 +1,45 @@ +package cn.hutool.core.text; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.LinkedList; +import java.util.List; + +public class StrUtilTest { + @Test + public void testIssAllBlank() { + List queue = new LinkedList<>(); + queue.add("apple"); + queue.add("banana"); + queue.add("cherry"); + queue.add("orange"); + queue.add("strawberry"); + queue.add("watermelon"); + Assert.assertFalse(StrUtil.isAllBlank(queue)); + + Assert.assertTrue(CharSequenceUtil.isAllBlank("")); + Assert.assertTrue(CharSequenceUtil.isAllBlank(" ")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\t")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\n")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\r")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\f")); + Assert.assertFalse(CharSequenceUtil.isAllBlank("\b")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u00A0")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\uFEFF")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2000")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2001")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2002")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2003")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2004")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2005")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2006")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2007")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2008")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2009")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u200A")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u3000")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\uFEFF")); + + } +} From e4737f0a5d59223a20c4e57c3fb1fa9201f45e4e Mon Sep 17 00:00:00 2001 From: duandazhi Date: Tue, 28 Jun 2022 17:29:14 +0800 Subject: [PATCH 03/10] add more StrUtilTest --- .../java/cn/hutool/core/text/StrUtilTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java index 20b23d523..c3b8f1e6e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -7,6 +7,44 @@ import java.util.LinkedList; import java.util.List; public class StrUtilTest { + @Test + public void testReplace2() { + // https://gitee.com/dromara/hutool/issues/I4M16G + final String replace = "#{A}"; + final String result = StrUtil.replace(replace, "#{AAAAAAA}", "1"); + Assert.assertEquals(replace, result); + } + + @Test + public void testReplaceByStr() { + final String replace = "SSM15930297701BeryAllen"; + final String result = StrUtil.replace(replace, 5, 12, "***"); + Assert.assertEquals("SSM15***01BeryAllen", result); + } + + @Test + public void testAddPrefixIfNot() { + final String str = "hutool"; + String result = StrUtil.addPrefixIfNot(str, "hu"); + Assert.assertEquals(str, result); + + result = StrUtil.addPrefixIfNot(str, "Good"); + Assert.assertEquals("Good" + str, result); + } + + @Test + public void testAddSuffixIfNot() { + final String str = "hutool"; + String result = StrUtil.addSuffixIfNot(str, "tool"); + Assert.assertEquals(str, result); + + result = StrUtil.addSuffixIfNot(str, " is Good"); + Assert.assertEquals(str + " is Good", result); + + result = StrUtil.addSuffixIfNot("", "/"); + Assert.assertEquals("/", result); + } + @Test public void testIssAllBlank() { List queue = new LinkedList<>(); @@ -41,5 +79,13 @@ public class StrUtilTest { Assert.assertTrue(CharSequenceUtil.isAllBlank("\u3000")); Assert.assertTrue(CharSequenceUtil.isAllBlank("\uFEFF")); + // 其他空白字符 + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u000B")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u000C")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u00A0")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u1680")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u180E")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2000")); + Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2001")); } } From 2cb7d774c9fa1e89ce06d6a8b1e9bee15fe8d232 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Tue, 28 Jun 2022 19:05:55 +0800 Subject: [PATCH 04/10] =?UTF-8?q?isAllBlank=20=E4=BF=AE=E6=94=B9=EF=BC=9A?= =?UTF-8?q?=20Collection<=3F=20extends=20CharSequence>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java index 2b520bceb..a86ff17b0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java @@ -8,8 +8,6 @@ import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Collection; -import java.util.Iterator; -import java.util.List; import java.util.Map; /** @@ -425,7 +423,7 @@ public class StrUtil extends CharSequenceUtil implements StrPool { * @return 批量判断字符串是否全部为空白 * @since 6.0.1 */ - public static boolean isAllBlank(final Collection strs) { + public static boolean isAllBlank(final Collection strs) { if (ArrayUtil.isEmpty(strs)) { return true; } From 9f12f3d991d679c97d0f584bc1c52deae933d15e Mon Sep 17 00:00:00 2001 From: duandazhi Date: Wed, 29 Jun 2022 17:02:45 +0800 Subject: [PATCH 05/10] =?UTF-8?q?getTypeOfNull=20pmd=20=3D=20ps.getParamet?= =?UTF-8?q?erMetaData()=20NPE=20Optimization=20=20=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-db/src/main/java/cn/hutool/db/StatementUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java index 935aeb575..ad8e63825 100644 --- a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java @@ -287,6 +287,8 @@ public class StatementUtil { * @since 4.6.7 */ public static int getTypeOfNull(final PreparedStatement ps, final int paramIndex) { + Assert.notNull(ps, "ps PreparedStatement must be not null in (getTypeOfNull)!"); + int sqlType = Types.VARCHAR; final ParameterMetaData pmd; From c56959fe7a49bae19a23eb2f924557d8ab611c1f Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 29 Jun 2022 18:48:58 +0800 Subject: [PATCH 06/10] add methods --- .../cn/hutool/core/text/CharSequenceUtil.java | 40 ++++++++++++++++++- .../java/cn/hutool/core/text/StrUtil.java | 19 --------- .../java/cn/hutool/core/text/StrUtilTest.java | 2 +- 3 files changed, 40 insertions(+), 21 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 f6280bfde..01f1be4b3 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -19,6 +19,7 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.MessageFormat; import java.text.Normalizer; +import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -162,6 +163,26 @@ public class CharSequenceUtil { return false; } + /** + * 指定字符串集合中,是否包含空字符串。 + * + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @see CharSequenceUtil#hasBlank(CharSequence...) + * @since 6.0.0 + */ + public static boolean hasBlank(final Collection strs) { + if (ArrayUtil.isEmpty(strs)) { + return true; + } + for (final CharSequence str : strs) { + if (isBlank(str)) { + return true; + } + } + return false; + } + /** *

指定字符串数组中的元素,是否全部为空字符串。

*

如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

@@ -197,6 +218,23 @@ public class CharSequenceUtil { return true; } + /** + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @see CharSequenceUtil#isAllBlank(CharSequence...) + * @since 6.0.1 + */ + public static boolean isAllBlank(final Collection strs) { + if (CollUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotBlank(str)) { + return false; + } + } + } + return true; + } + /** *

字符串是否为空,空的定义如下:

*
    @@ -3991,7 +4029,7 @@ public class CharSequenceUtil { /** * 过滤字符串 * - * @param str 字符串 + * @param str 字符串 * @param predicate 过滤器,{@link Predicate#test(Object)}为{@code true}保留字符 * @return 过滤后的字符串 * @since 5.4.0 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java index a86ff17b0..b3e63f3da 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java @@ -7,7 +7,6 @@ import java.io.StringReader; import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.charset.Charset; -import java.util.Collection; import java.util.Map; /** @@ -416,22 +415,4 @@ public class StrUtil extends CharSequenceUtil implements StrPool { public static String format(final CharSequence template, final Map map, final boolean ignoreNull) { return StrFormatter.format(template, map, ignoreNull); } - - /** - * @see CharSequenceUtil#isAllBlank(CharSequence...) - * @param strs 字符串列表 - * @return 批量判断字符串是否全部为空白 - * @since 6.0.1 - */ - public static boolean isAllBlank(final Collection strs) { - if (ArrayUtil.isEmpty(strs)) { - return true; - } - for (final CharSequence str : strs) { - if (isNotBlank(str)) { - return false; - } - } - return true; - } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java index c3b8f1e6e..2e9a3282a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -47,7 +47,7 @@ public class StrUtilTest { @Test public void testIssAllBlank() { - List queue = new LinkedList<>(); + final List queue = new LinkedList<>(); queue.add("apple"); queue.add("banana"); queue.add("cherry"); From 56bc948d997255c00ddc530ef0f77623057ea015 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 29 Jun 2022 18:58:53 +0800 Subject: [PATCH 07/10] add methods --- .../cn/hutool/core/text/CharSequenceUtil.java | 60 +++++++++++++++---- .../java/cn/hutool/core/text/StrUtilTest.java | 2 +- 2 files changed, 50 insertions(+), 12 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 01f1be4b3..0e534da4d 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -19,7 +19,6 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.MessageFormat; import java.text.Normalizer; -import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -171,8 +170,8 @@ public class CharSequenceUtil { * @see CharSequenceUtil#hasBlank(CharSequence...) * @since 6.0.0 */ - public static boolean hasBlank(final Collection strs) { - if (ArrayUtil.isEmpty(strs)) { + public static boolean hasBlank(final Iterable strs) { + if (CollUtil.isEmpty(strs)) { return true; } for (final CharSequence str : strs) { @@ -224,7 +223,7 @@ public class CharSequenceUtil { * @see CharSequenceUtil#isAllBlank(CharSequence...) * @since 6.0.1 */ - public static boolean isAllBlank(final Collection strs) { + public static boolean isAllBlank(final Iterable strs) { if (CollUtil.isNotEmpty(strs)) { for (final CharSequence str : strs) { if (isNotBlank(str)) { @@ -415,6 +414,27 @@ public class CharSequenceUtil { return false; } + /** + *

    是否包含空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    + * + * @param strs 字符串列表 + * @return 是否包含空字符串 + * @since 6.0.0 + */ + public static boolean hasEmpty(final Iterable strs) { + if (CollUtil.isEmpty(strs)) { + return true; + } + + for (final CharSequence str : strs) { + if (isEmpty(str)) { + return true; + } + } + return false; + } + /** *

    指定字符串数组中的元素,是否全部为空字符串。

    *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    @@ -439,15 +459,33 @@ public class CharSequenceUtil { * @return 所有字符串是否为空白 */ public static boolean isAllEmpty(final CharSequence... strs) { - if (ArrayUtil.isEmpty(strs)) { - return true; - } - - for (final CharSequence str : strs) { - if (isNotEmpty(str)) { - return false; + if (ArrayUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotEmpty(str)) { + return false; + } } } + + return true; + } + + /** + *

    指定字符串数组中的元素,是否全部为空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    + * + * @param strs 字符串列表 + * @return 所有字符串是否为空白 + */ + public static boolean isAllEmpty(final Iterable strs) { + if (CollUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotEmpty(str)) { + return false; + } + } + } + return true; } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java index 2e9a3282a..47aea4ad5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -46,7 +46,7 @@ public class StrUtilTest { } @Test - public void testIssAllBlank() { + public void testIsAllBlank() { final List queue = new LinkedList<>(); queue.add("apple"); queue.add("banana"); From 2bcb8f3f7923bd8c35b0e0b624735e3925b97e99 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 29 Jun 2022 19:09:59 +0800 Subject: [PATCH 08/10] add methods --- .../cn/hutool/core/text/CharSequenceUtil.java | 474 +---------------- .../java/cn/hutool/core/text/StrChecker.java | 489 ++++++++++++++++++ 2 files changed, 490 insertions(+), 473 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/text/StrChecker.java 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 0e534da4d..122362c22 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -32,264 +32,15 @@ import java.util.function.Predicate; * @author looly * @since 5.5.3 */ -public class CharSequenceUtil { +public class CharSequenceUtil extends StrChecker{ public static final int INDEX_NOT_FOUND = Finder.INDEX_NOT_FOUND; - /** - * 字符串常量:{@code "null"}
    - * 注意:{@code "null" != null} - */ - public static final String NULL = "null"; - - /** - * 字符串常量:空字符串 {@code ""} - */ - public static final String EMPTY = ""; - /** * 字符串常量:空格符 {@code " "} */ public static final String SPACE = " "; - /** - *

    字符串是否为空白,空白的定义如下:

    - *
      - *
    1. {@code null}
    2. - *
    3. 空字符串:{@code ""}
    4. - *
    5. 空格、全角空格、制表符、换行符,等不可见字符
    6. - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isBlank(null) // true}
    • - *
    • {@code StrUtil.isBlank("") // true}
    • - *
    • {@code StrUtil.isBlank(" \t\n") // true}
    • - *
    • {@code StrUtil.isBlank("abc") // false}
    • - *
    - * - *

    注意:该方法与 {@link #isEmpty(CharSequence)} 的区别是: - * 该方法会校验空白字符,且性能相对于 {@link #isEmpty(CharSequence)} 略慢。

    - *
    - * - *

    建议:

    - *
      - *
    • 该方法建议仅对于客户端(或第三方接口)传入的参数使用该方法。
    • - *
    • 需要同时校验多个字符串时,建议采用 {@link #hasBlank(CharSequence...)} 或 {@link #isAllBlank(CharSequence...)}
    • - *
    - * - * @param str 被检测的字符串 - * @return 若为空白,则返回 true - * @see #isEmpty(CharSequence) - */ - public static boolean isBlank(final CharSequence str) { - final int length; - - if ((str == null) || ((length = str.length()) == 0)) { - return true; - } - - for (int i = 0; i < length; i++) { - // 只要有一个非空字符即为非空字符串 - if (false == CharUtil.isBlankChar(str.charAt(i))) { - return false; - } - } - - return true; - } - - /** - *

    字符串是否为非空白,非空白的定义如下:

    - *
      - *
    1. 不为 {@code null}
    2. - *
    3. 不为空字符串:{@code ""}
    4. - *
    5. 不为空格、全角空格、制表符、换行符,等不可见字符
    6. - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isNotBlank(null) // false}
    • - *
    • {@code StrUtil.isNotBlank("") // false}
    • - *
    • {@code StrUtil.isNotBlank(" \t\n") // false}
    • - *
    • {@code StrUtil.isNotBlank("abc") // true}
    • - *
    - * - *

    注意:该方法与 {@link #isNotEmpty(CharSequence)} 的区别是: - * 该方法会校验空白字符,且性能相对于 {@link #isNotEmpty(CharSequence)} 略慢。

    - *

    建议:仅对于客户端(或第三方接口)传入的参数使用该方法。

    - * - * @param str 被检测的字符串 - * @return 是否为非空 - * @see #isBlank(CharSequence) - */ - public static boolean isNotBlank(final CharSequence str) { - return false == isBlank(str); - } - - /** - *

    指定字符串数组中,是否包含空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.hasBlank() // true}
    • - *
    • {@code StrUtil.hasBlank("", null, " ") // true}
    • - *
    • {@code StrUtil.hasBlank("123", " ") // true}
    • - *
    • {@code StrUtil.hasBlank("123", "abc") // false}
    • - *
    - * - *

    注意:该方法与 {@link #isAllBlank(CharSequence...)} 的区别在于:

    - *
      - *
    • hasBlank(CharSequence...) 等价于 {@code isBlank(...) || isBlank(...) || ...}
    • - *
    • {@link #isAllBlank(CharSequence...)} 等价于 {@code isBlank(...) && isBlank(...) && ...}
    • - *
    - * - * @param strs 字符串列表 - * @return 是否包含空字符串 - */ - public static boolean hasBlank(final CharSequence... strs) { - if (ArrayUtil.isEmpty(strs)) { - return true; - } - - for (final CharSequence str : strs) { - if (isBlank(str)) { - return true; - } - } - return false; - } - - /** - * 指定字符串集合中,是否包含空字符串。 - * - * @param strs 字符串列表 - * @return 批量判断字符串是否全部为空白 - * @see CharSequenceUtil#hasBlank(CharSequence...) - * @since 6.0.0 - */ - public static boolean hasBlank(final Iterable strs) { - if (CollUtil.isEmpty(strs)) { - return true; - } - for (final CharSequence str : strs) { - if (isBlank(str)) { - return true; - } - } - return false; - } - - /** - *

    指定字符串数组中的元素,是否全部为空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isAllBlank() // true}
    • - *
    • {@code StrUtil.isAllBlank("", null, " ") // true}
    • - *
    • {@code StrUtil.isAllBlank("123", " ") // false}
    • - *
    • {@code StrUtil.isAllBlank("123", "abc") // false}
    • - *
    - * - *

    注意:该方法与 {@link #hasBlank(CharSequence...)} 的区别在于:

    - *
      - *
    • {@link #hasBlank(CharSequence...)} 等价于 {@code isBlank(...) || isBlank(...) || ...}
    • - *
    • isAllBlank(CharSequence...) 等价于 {@code isBlank(...) && isBlank(...) && ...}
    • - *
    - * - * @param strs 字符串列表 - * @return 所有字符串是否为空白 - */ - public static boolean isAllBlank(final CharSequence... strs) { - if (ArrayUtil.isEmpty(strs)) { - return true; - } - - for (final CharSequence str : strs) { - if (isNotBlank(str)) { - return false; - } - } - return true; - } - - /** - * @param strs 字符串列表 - * @return 批量判断字符串是否全部为空白 - * @see CharSequenceUtil#isAllBlank(CharSequence...) - * @since 6.0.1 - */ - public static boolean isAllBlank(final Iterable strs) { - if (CollUtil.isNotEmpty(strs)) { - for (final CharSequence str : strs) { - if (isNotBlank(str)) { - return false; - } - } - } - return true; - } - - /** - *

    字符串是否为空,空的定义如下:

    - *
      - *
    1. {@code null}
    2. - *
    3. 空字符串:{@code ""}
    4. - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isEmpty(null) // true}
    • - *
    • {@code StrUtil.isEmpty("") // true}
    • - *
    • {@code StrUtil.isEmpty(" \t\n") // false}
    • - *
    • {@code StrUtil.isEmpty("abc") // false}
    • - *
    - * - *

    注意:该方法与 {@link #isBlank(CharSequence)} 的区别是:该方法不校验空白字符。

    - *

    建议:

    - *
      - *
    • 该方法建议用于工具类或任何可以预期的方法参数的校验中。
    • - *
    • 需要同时校验多个字符串时,建议采用 {@link #hasEmpty(CharSequence...)} 或 {@link #isAllEmpty(CharSequence...)}
    • - *
    - * - * @param str 被检测的字符串 - * @return 是否为空 - * @see #isBlank(CharSequence) - */ - public static boolean isEmpty(final CharSequence str) { - return str == null || str.length() == 0; - } - - /** - *

    字符串是否为非空白,非空白的定义如下:

    - *
      - *
    1. 不为 {@code null}
    2. - *
    3. 不为空字符串:{@code ""}
    4. - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isNotEmpty(null) // false}
    • - *
    • {@code StrUtil.isNotEmpty("") // false}
    • - *
    • {@code StrUtil.isNotEmpty(" \t\n") // true}
    • - *
    • {@code StrUtil.isNotEmpty("abc") // true}
    • - *
    - * - *

    注意:该方法与 {@link #isNotBlank(CharSequence)} 的区别是:该方法不校验空白字符。

    - *

    建议:该方法建议用于工具类或任何可以预期的方法参数的校验中。

    - * - * @param str 被检测的字符串 - * @return 是否为非空 - * @see #isEmpty(CharSequence) - */ - public static boolean isNotEmpty(final CharSequence str) { - return false == isEmpty(str); - } - /** * 当给定字符串为null时,转换为Empty * @@ -378,209 +129,6 @@ public class CharSequenceUtil { return isEmpty(str) ? null : str.toString(); } - /** - *

    是否包含空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.hasEmpty() // true}
    • - *
    • {@code StrUtil.hasEmpty("", null) // true}
    • - *
    • {@code StrUtil.hasEmpty("123", "") // true}
    • - *
    • {@code StrUtil.hasEmpty("123", "abc") // false}
    • - *
    • {@code StrUtil.hasEmpty(" ", "\t", "\n") // false}
    • - *
    - * - *

    注意:该方法与 {@link #isAllEmpty(CharSequence...)} 的区别在于:

    - *
      - *
    • hasEmpty(CharSequence...) 等价于 {@code isEmpty(...) || isEmpty(...) || ...}
    • - *
    • {@link #isAllEmpty(CharSequence...)} 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • - *
    - * - * @param strs 字符串列表 - * @return 是否包含空字符串 - */ - public static boolean hasEmpty(final CharSequence... strs) { - if (ArrayUtil.isEmpty(strs)) { - return true; - } - - for (final CharSequence str : strs) { - if (isEmpty(str)) { - return true; - } - } - return false; - } - - /** - *

    是否包含空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    - * - * @param strs 字符串列表 - * @return 是否包含空字符串 - * @since 6.0.0 - */ - public static boolean hasEmpty(final Iterable strs) { - if (CollUtil.isEmpty(strs)) { - return true; - } - - for (final CharSequence str : strs) { - if (isEmpty(str)) { - return true; - } - } - return false; - } - - /** - *

    指定字符串数组中的元素,是否全部为空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isAllEmpty() // true}
    • - *
    • {@code StrUtil.isAllEmpty("", null) // true}
    • - *
    • {@code StrUtil.isAllEmpty("123", "") // false}
    • - *
    • {@code StrUtil.isAllEmpty("123", "abc") // false}
    • - *
    • {@code StrUtil.isAllEmpty(" ", "\t", "\n") // false}
    • - *
    - * - *

    注意:该方法与 {@link #hasEmpty(CharSequence...)} 的区别在于:

    - *
      - *
    • {@link #hasEmpty(CharSequence...)} 等价于 {@code isEmpty(...) || isEmpty(...) || ...}
    • - *
    • isAllEmpty(CharSequence...) 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • - *
    - * - * @param strs 字符串列表 - * @return 所有字符串是否为空白 - */ - public static boolean isAllEmpty(final CharSequence... strs) { - if (ArrayUtil.isNotEmpty(strs)) { - for (final CharSequence str : strs) { - if (isNotEmpty(str)) { - return false; - } - } - } - - return true; - } - - /** - *

    指定字符串数组中的元素,是否全部为空字符串。

    - *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    - * - * @param strs 字符串列表 - * @return 所有字符串是否为空白 - */ - public static boolean isAllEmpty(final Iterable strs) { - if (CollUtil.isNotEmpty(strs)) { - for (final CharSequence str : strs) { - if (isNotEmpty(str)) { - return false; - } - } - } - - return true; - } - - /** - *

    指定字符串数组中的元素,是否都不为空字符串。

    - *

    如果指定的字符串数组的长度不为 0,或者所有元素都不是空字符串,则返回 true。

    - *
    - * - *

    例:

    - *
      - *
    • {@code StrUtil.isAllNotEmpty() // false}
    • - *
    • {@code StrUtil.isAllNotEmpty("", null) // false}
    • - *
    • {@code StrUtil.isAllNotEmpty("123", "") // false}
    • - *
    • {@code StrUtil.isAllNotEmpty("123", "abc") // true}
    • - *
    • {@code StrUtil.isAllNotEmpty(" ", "\t", "\n") // true}
    • - *
    - * - *

    注意:该方法与 {@link #isAllEmpty(CharSequence...)} 的区别在于:

    - *
      - *
    • {@link #isAllEmpty(CharSequence...)} 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • - *
    • isAllNotEmpty(CharSequence...) 等价于 {@code !isEmpty(...) && !isEmpty(...) && ...}
    • - *
    - * - * @param args 字符串数组 - * @return 所有字符串是否都不为为空白 - * @since 5.3.6 - */ - public static boolean isAllNotEmpty(final CharSequence... args) { - return false == hasEmpty(args); - } - - /** - * 是否存都不为{@code null}或空对象或空白符的对象,通过{@link #hasBlank(CharSequence...)} 判断元素 - * - * @param args 被检查的对象,一个或者多个 - * @return 是否都不为空 - * @since 5.3.6 - */ - public static boolean isAllNotBlank(final CharSequence... args) { - return false == hasBlank(args); - } - - /** - * 检查字符串是否为null、“null”、“undefined” - * - * @param str 被检查的字符串 - * @return 是否为null、“null”、“undefined” - * @since 4.0.10 - */ - public static boolean isNullOrUndefined(final CharSequence str) { - if (null == str) { - return true; - } - return isNullOrUndefinedStr(str); - } - - /** - * 检查字符串是否为null、“”、“null”、“undefined” - * - * @param str 被检查的字符串 - * @return 是否为null、“”、“null”、“undefined” - * @since 4.0.10 - */ - public static boolean isEmptyOrUndefined(final CharSequence str) { - if (isEmpty(str)) { - return true; - } - return isNullOrUndefinedStr(str); - } - - /** - * 检查字符串是否为null、空白串、“null”、“undefined” - * - * @param str 被检查的字符串 - * @return 是否为null、空白串、“null”、“undefined” - * @since 4.0.10 - */ - public static boolean isBlankOrUndefined(final CharSequence str) { - if (isBlank(str)) { - return true; - } - return isNullOrUndefinedStr(str); - } - - /** - * 是否为“null”、“undefined”,不做空指针检查 - * - * @param str 字符串 - * @return 是否为“null”、“undefined” - */ - private static boolean isNullOrUndefinedStr(final CharSequence str) { - final String strString = str.toString().trim(); - return NULL.equals(strString) || "undefined".equals(strString); - } - // ------------------------------------------------------------------------ Trim /** @@ -4427,26 +3975,6 @@ public class CharSequenceUtil { return CollUtil.join(iterable, conjunction); } - /** - * 字符串的每一个字符是否都与定义的匹配器匹配 - * - * @param value 字符串 - * @param matcher 匹配器 - * @return 是否全部匹配 - * @since 3.2.3 - */ - public static boolean isAllCharMatch(final CharSequence value, final Predicate matcher) { - if (StrUtil.isBlank(value)) { - return false; - } - for (int i = value.length(); --i >= 0; ) { - if (false == matcher.test(value.charAt(i))) { - return false; - } - } - return true; - } - /** * 检查字符串是否都为数字组成 * diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrChecker.java b/hutool-core/src/main/java/cn/hutool/core/text/StrChecker.java new file mode 100644 index 000000000..a00d3da28 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrChecker.java @@ -0,0 +1,489 @@ +package cn.hutool.core.text; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; + +import java.util.function.Predicate; + +/** + * 字符串检查工具类,提供字符串的blank和empty等检查
    + *
      + *
    • empty定义:{@code null} or 空字符串:{@code ""}
    • + *
    • blank定义:{@code null} or 空字符串:{@code ""} or 空格、全角空格、制表符、换行符,等不可见字符
    • + *
    + */ +public class StrChecker { + + /** + * 字符串常量:{@code "null"}
    + * 注意:{@code "null" != null} + */ + public static final String NULL = "null"; + + /** + * 字符串常量:空字符串 {@code ""} + */ + public static final String EMPTY = ""; + + /** + *

    字符串是否为空白,空白的定义如下:

    + *
      + *
    1. {@code null}
    2. + *
    3. 空字符串:{@code ""}
    4. + *
    5. 空格、全角空格、制表符、换行符,等不可见字符
    6. + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isBlank(null) // true}
    • + *
    • {@code StrUtil.isBlank("") // true}
    • + *
    • {@code StrUtil.isBlank(" \t\n") // true}
    • + *
    • {@code StrUtil.isBlank("abc") // false}
    • + *
    + * + *

    注意:该方法与 {@link #isEmpty(CharSequence)} 的区别是: + * 该方法会校验空白字符,且性能相对于 {@link #isEmpty(CharSequence)} 略慢。

    + *
    + * + *

    建议:

    + *
      + *
    • 该方法建议仅对于客户端(或第三方接口)传入的参数使用该方法。
    • + *
    • 需要同时校验多个字符串时,建议采用 {@link #hasBlank(CharSequence...)} 或 {@link #isAllBlank(CharSequence...)}
    • + *
    + * + * @param str 被检测的字符串 + * @return 若为空白,则返回 true + * @see #isEmpty(CharSequence) + */ + public static boolean isBlank(final CharSequence str) { + final int length; + + if ((str == null) || ((length = str.length()) == 0)) { + return true; + } + + for (int i = 0; i < length; i++) { + // 只要有一个非空字符即为非空字符串 + if (false == CharUtil.isBlankChar(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + *

    字符串是否为非空白,非空白的定义如下:

    + *
      + *
    1. 不为 {@code null}
    2. + *
    3. 不为空字符串:{@code ""}
    4. + *
    5. 不为空格、全角空格、制表符、换行符,等不可见字符
    6. + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isNotBlank(null) // false}
    • + *
    • {@code StrUtil.isNotBlank("") // false}
    • + *
    • {@code StrUtil.isNotBlank(" \t\n") // false}
    • + *
    • {@code StrUtil.isNotBlank("abc") // true}
    • + *
    + * + *

    注意:该方法与 {@link #isNotEmpty(CharSequence)} 的区别是: + * 该方法会校验空白字符,且性能相对于 {@link #isNotEmpty(CharSequence)} 略慢。

    + *

    建议:仅对于客户端(或第三方接口)传入的参数使用该方法。

    + * + * @param str 被检测的字符串 + * @return 是否为非空 + * @see #isBlank(CharSequence) + */ + public static boolean isNotBlank(final CharSequence str) { + return false == isBlank(str); + } + + /** + *

    指定字符串数组中,是否包含空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.hasBlank() // true}
    • + *
    • {@code StrUtil.hasBlank("", null, " ") // true}
    • + *
    • {@code StrUtil.hasBlank("123", " ") // true}
    • + *
    • {@code StrUtil.hasBlank("123", "abc") // false}
    • + *
    + * + *

    注意:该方法与 {@link #isAllBlank(CharSequence...)} 的区别在于:

    + *
      + *
    • hasBlank(CharSequence...) 等价于 {@code isBlank(...) || isBlank(...) || ...}
    • + *
    • {@link #isAllBlank(CharSequence...)} 等价于 {@code isBlank(...) && isBlank(...) && ...}
    • + *
    + * + * @param strs 字符串列表 + * @return 是否包含空字符串 + */ + public static boolean hasBlank(final CharSequence... strs) { + if (ArrayUtil.isEmpty(strs)) { + return true; + } + + for (final CharSequence str : strs) { + if (isBlank(str)) { + return true; + } + } + return false; + } + + /** + * 指定字符串集合中,是否包含空字符串。 + * + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @see CharSequenceUtil#hasBlank(CharSequence...) + * @since 6.0.0 + */ + public static boolean hasBlank(final Iterable strs) { + if (CollUtil.isEmpty(strs)) { + return true; + } + for (final CharSequence str : strs) { + if (isBlank(str)) { + return true; + } + } + return false; + } + + /** + *

    指定字符串数组中的元素,是否全部为空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isAllBlank() // true}
    • + *
    • {@code StrUtil.isAllBlank("", null, " ") // true}
    • + *
    • {@code StrUtil.isAllBlank("123", " ") // false}
    • + *
    • {@code StrUtil.isAllBlank("123", "abc") // false}
    • + *
    + * + *

    注意:该方法与 {@link #hasBlank(CharSequence...)} 的区别在于:

    + *
      + *
    • {@link #hasBlank(CharSequence...)} 等价于 {@code isBlank(...) || isBlank(...) || ...}
    • + *
    • isAllBlank(CharSequence...) 等价于 {@code isBlank(...) && isBlank(...) && ...}
    • + *
    + * + * @param strs 字符串列表 + * @return 所有字符串是否为空白 + */ + public static boolean isAllBlank(final CharSequence... strs) { + if (ArrayUtil.isEmpty(strs)) { + return true; + } + + for (final CharSequence str : strs) { + if (isNotBlank(str)) { + return false; + } + } + return true; + } + + /** + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @see CharSequenceUtil#isAllBlank(CharSequence...) + * @since 6.0.1 + */ + public static boolean isAllBlank(final Iterable strs) { + if (CollUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotBlank(str)) { + return false; + } + } + } + return true; + } + + /** + *

    字符串是否为空,空的定义如下:

    + *
      + *
    1. {@code null}
    2. + *
    3. 空字符串:{@code ""}
    4. + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isEmpty(null) // true}
    • + *
    • {@code StrUtil.isEmpty("") // true}
    • + *
    • {@code StrUtil.isEmpty(" \t\n") // false}
    • + *
    • {@code StrUtil.isEmpty("abc") // false}
    • + *
    + * + *

    注意:该方法与 {@link #isBlank(CharSequence)} 的区别是:该方法不校验空白字符。

    + *

    建议:

    + *
      + *
    • 该方法建议用于工具类或任何可以预期的方法参数的校验中。
    • + *
    • 需要同时校验多个字符串时,建议采用 {@link #hasEmpty(CharSequence...)} 或 {@link #isAllEmpty(CharSequence...)}
    • + *
    + * + * @param str 被检测的字符串 + * @return 是否为空 + * @see #isBlank(CharSequence) + */ + public static boolean isEmpty(final CharSequence str) { + return str == null || str.length() == 0; + } + + /** + *

    字符串是否为非空白,非空白的定义如下:

    + *
      + *
    1. 不为 {@code null}
    2. + *
    3. 不为空字符串:{@code ""}
    4. + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isNotEmpty(null) // false}
    • + *
    • {@code StrUtil.isNotEmpty("") // false}
    • + *
    • {@code StrUtil.isNotEmpty(" \t\n") // true}
    • + *
    • {@code StrUtil.isNotEmpty("abc") // true}
    • + *
    + * + *

    注意:该方法与 {@link #isNotBlank(CharSequence)} 的区别是:该方法不校验空白字符。

    + *

    建议:该方法建议用于工具类或任何可以预期的方法参数的校验中。

    + * + * @param str 被检测的字符串 + * @return 是否为非空 + * @see #isEmpty(CharSequence) + */ + public static boolean isNotEmpty(final CharSequence str) { + return false == isEmpty(str); + } + + /** + *

    是否包含空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.hasEmpty() // true}
    • + *
    • {@code StrUtil.hasEmpty("", null) // true}
    • + *
    • {@code StrUtil.hasEmpty("123", "") // true}
    • + *
    • {@code StrUtil.hasEmpty("123", "abc") // false}
    • + *
    • {@code StrUtil.hasEmpty(" ", "\t", "\n") // false}
    • + *
    + * + *

    注意:该方法与 {@link #isAllEmpty(CharSequence...)} 的区别在于:

    + *
      + *
    • hasEmpty(CharSequence...) 等价于 {@code isEmpty(...) || isEmpty(...) || ...}
    • + *
    • {@link #isAllEmpty(CharSequence...)} 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • + *
    + * + * @param strs 字符串列表 + * @return 是否包含空字符串 + */ + public static boolean hasEmpty(final CharSequence... strs) { + if (ArrayUtil.isEmpty(strs)) { + return true; + } + + for (final CharSequence str : strs) { + if (isEmpty(str)) { + return true; + } + } + return false; + } + + /** + *

    是否包含空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。

    + * + * @param strs 字符串列表 + * @return 是否包含空字符串 + * @since 6.0.0 + */ + public static boolean hasEmpty(final Iterable strs) { + if (CollUtil.isEmpty(strs)) { + return true; + } + + for (final CharSequence str : strs) { + if (isEmpty(str)) { + return true; + } + } + return false; + } + + /** + *

    指定字符串数组中的元素,是否全部为空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isAllEmpty() // true}
    • + *
    • {@code StrUtil.isAllEmpty("", null) // true}
    • + *
    • {@code StrUtil.isAllEmpty("123", "") // false}
    • + *
    • {@code StrUtil.isAllEmpty("123", "abc") // false}
    • + *
    • {@code StrUtil.isAllEmpty(" ", "\t", "\n") // false}
    • + *
    + * + *

    注意:该方法与 {@link #hasEmpty(CharSequence...)} 的区别在于:

    + *
      + *
    • {@link #hasEmpty(CharSequence...)} 等价于 {@code isEmpty(...) || isEmpty(...) || ...}
    • + *
    • isAllEmpty(CharSequence...) 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • + *
    + * + * @param strs 字符串列表 + * @return 所有字符串是否为空白 + */ + public static boolean isAllEmpty(final CharSequence... strs) { + if (ArrayUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotEmpty(str)) { + return false; + } + } + } + + return true; + } + + /** + *

    指定字符串数组中的元素,是否全部为空字符串。

    + *

    如果指定的字符串数组的长度为 0,或者所有元素都是空字符串,则返回 true。

    + * + * @param strs 字符串列表 + * @return 所有字符串是否为空白 + */ + public static boolean isAllEmpty(final Iterable strs) { + if (CollUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (isNotEmpty(str)) { + return false; + } + } + } + + return true; + } + + /** + *

    指定字符串数组中的元素,是否都不为空字符串。

    + *

    如果指定的字符串数组的长度不为 0,或者所有元素都不是空字符串,则返回 true。

    + *
    + * + *

    例:

    + *
      + *
    • {@code StrUtil.isAllNotEmpty() // false}
    • + *
    • {@code StrUtil.isAllNotEmpty("", null) // false}
    • + *
    • {@code StrUtil.isAllNotEmpty("123", "") // false}
    • + *
    • {@code StrUtil.isAllNotEmpty("123", "abc") // true}
    • + *
    • {@code StrUtil.isAllNotEmpty(" ", "\t", "\n") // true}
    • + *
    + * + *

    注意:该方法与 {@link #isAllEmpty(CharSequence...)} 的区别在于:

    + *
      + *
    • {@link #isAllEmpty(CharSequence...)} 等价于 {@code isEmpty(...) && isEmpty(...) && ...}
    • + *
    • isAllNotEmpty(CharSequence...) 等价于 {@code !isEmpty(...) && !isEmpty(...) && ...}
    • + *
    + * + * @param args 字符串数组 + * @return 所有字符串是否都不为为空白 + * @since 5.3.6 + */ + public static boolean isAllNotEmpty(final CharSequence... args) { + return false == hasEmpty(args); + } + + /** + * 是否存都不为{@code null}或空对象或空白符的对象,通过{@link #hasBlank(CharSequence...)} 判断元素 + * + * @param args 被检查的对象,一个或者多个 + * @return 是否都不为空 + * @since 5.3.6 + */ + public static boolean isAllNotBlank(final CharSequence... args) { + return false == hasBlank(args); + } + + /** + * 检查字符串是否为null、“null”、“undefined” + * + * @param str 被检查的字符串 + * @return 是否为null、“null”、“undefined” + * @since 4.0.10 + */ + public static boolean isNullOrUndefined(final CharSequence str) { + if (null == str) { + return true; + } + return isNullOrUndefinedStr(str); + } + + /** + * 检查字符串是否为null、“”、“null”、“undefined” + * + * @param str 被检查的字符串 + * @return 是否为null、“”、“null”、“undefined” + * @since 4.0.10 + */ + public static boolean isEmptyOrUndefined(final CharSequence str) { + if (isEmpty(str)) { + return true; + } + return isNullOrUndefinedStr(str); + } + + /** + * 检查字符串是否为null、空白串、“null”、“undefined” + * + * @param str 被检查的字符串 + * @return 是否为null、空白串、“null”、“undefined” + * @since 4.0.10 + */ + public static boolean isBlankOrUndefined(final CharSequence str) { + if (isBlank(str)) { + return true; + } + return isNullOrUndefinedStr(str); + } + + /** + * 是否为“null”、“undefined”,不做空指针检查 + * + * @param str 字符串 + * @return 是否为“null”、“undefined” + */ + private static boolean isNullOrUndefinedStr(final CharSequence str) { + final String strString = str.toString().trim(); + return NULL.equals(strString) || "undefined".equals(strString); + } + + /** + * 字符串的每一个字符是否都与定义的匹配器匹配 + * + * @param value 字符串 + * @param matcher 匹配器 + * @return 是否全部匹配 + * @since 3.2.3 + */ + public static boolean isAllCharMatch(final CharSequence value, final Predicate matcher) { + if (StrUtil.isBlank(value)) { + return false; + } + for (int i = value.length(); --i >= 0; ) { + if (false == matcher.test(value.charAt(i))) { + return false; + } + } + return true; + } +} From 7646683785d29074ba153ff21ed9556d933ffa13 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 30 Jun 2022 17:47:23 +0800 Subject: [PATCH 09/10] add testr --- .../cn/hutool/core/collection/CollUtilTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index 46f98a870..138fc304a 100755 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -912,4 +912,17 @@ public class CollUtilTest { Console.log(collection.getClass()); Assert.assertNotNull(collection); } + + @Test + public void transTest(){ + final List people = Arrays.asList( + new Person("aa", 12, "man", 1), + new Person("bb", 13, "woman", 2), + new Person("cc", 14, "man", 3), + new Person("dd", 15, "woman", 4) + ); + + final Collection trans = CollUtil.trans(people, Person::getName); + Assert.assertEquals("[aa, bb, cc, dd]", trans.toString()); + } } From 768c4a392d6e9f1a3c9f9c72a15c2c59ee37b5c4 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 30 Jun 2022 18:35:59 +0800 Subject: [PATCH 10/10] add isIn --- .../java/cn/hutool/core/math/NumberUtil.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java index 1ad8b765c..923058e4c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java @@ -946,6 +946,22 @@ public class NumberUtil { return Long.parseLong(binaryStr, 2); } + /** + * 检查值是否在指定范围内 + * + * @param value 值 + * @param minInclude 最小值(包含) + * @param maxInclude 最大值(包含) + * @return 经过检查后的值 + * @since 5.8.5 + */ + public static boolean isIn(final BigDecimal value, final BigDecimal minInclude, final BigDecimal maxInclude) { + Assert.notNull(value); + Assert.notNull(minInclude); + Assert.notNull(maxInclude); + return isGreaterOrEqual(value, minInclude) && isLessOrEqual(value, maxInclude); + } + /** * 比较大小,参数1 > 参数2 返回true *