From 656c5510685beff696bd819da74ff15829e9a4b0 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 15 Apr 2023 23:07:59 +0800 Subject: [PATCH] fix code --- .../dromara/hutool/core/array/ArrayUtil.java | 83 ++++++++ .../hutool/core/collection/iter/IterUtil.java | 51 ++++- .../dromara/hutool/core/convert/Convert.java | 3 +- .../org/dromara/hutool/core/regex/ReUtil.java | 5 +- .../hutool/core/spi/ListServiceLoader.java | 84 +++++--- .../hutool/core/text/CharSequenceUtil.java | 58 ++++-- .../dromara/hutool/core/text/StrChecker.java | 120 +---------- .../org/dromara/hutool/core/text/StrUtil.java | 3 +- .../hutool/core/collection/IterUtilTest.java | 144 ------------- .../core/collection/iter/IterUtilTest.java | 192 +++++++++++++++--- .../dromara/hutool/core/text/StrUtilTest.java | 45 ---- .../db/dialect/impl/AnsiSqlDialect.java | 2 +- .../org/dromara/hutool/db/sql/SqlBuilder.java | 2 +- 13 files changed, 400 insertions(+), 392 deletions(-) delete mode 100644 hutool-core/src/test/java/org/dromara/hutool/core/collection/IterUtilTest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java index cd7b9890c..1d3beb41c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java @@ -100,6 +100,89 @@ public class ArrayUtil extends PrimitiveArrayUtil { public static T[] ofArray(final Iterable iterable, final Class componentType) { return ofArray(IterUtil.getIter(iterable), componentType); } + + + // ---------------------------------------------------------------------- isBlank + /** + *

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

+ *

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

+ *
+ * + *

例:

+ *
    + *
  • {@code hasBlank() // true}
  • + *
  • {@code hasBlank("", null, " ") // true}
  • + *
  • {@code hasBlank("123", " ") // true}
  • + *
  • {@code 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 (StrUtil.isBlank(str)) { + return true; + } + } + return false; + } + + /** + * 是否存都不为{@code null}或空对象或空白符的对象,通过{@link #hasBlank(CharSequence...)} 判断元素 + * + * @param args 被检查的对象,一个或者多个 + * @return 是否都不为空 + */ + public static boolean isAllNotBlank(final CharSequence... args) { + return !hasBlank(args); + } + + /** + *

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

+ *

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

+ *
+ * + *

例:

+ *
    + *
  • {@code isAllBlank() // true}
  • + *
  • {@code isAllBlank("", null, " ") // true}
  • + *
  • {@code isAllBlank("123", " ") // false}
  • + *
  • {@code 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 (StrUtil.isNotBlank(str)) { + return false; + } + } + return true; + } + // ---------------------------------------------------------------------- isEmpty /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/iter/IterUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/iter/IterUtil.java index 4f1c5d599..c687b4626 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/iter/IterUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/iter/IterUtil.java @@ -12,13 +12,15 @@ package org.dromara.hutool.core.collection.iter; +import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.reflect.MethodUtil; import org.dromara.hutool.core.text.StrJoiner; -import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -135,6 +137,41 @@ public class IterUtil { return null == getFirstNoneNull(iter); } + /** + * 指定字符串集合中,是否包含空字符串。 + * + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @since 6.0.0 + */ + public static boolean hasBlank(final Iterable strs) { + if (CollUtil.isEmpty(strs)) { + return true; + } + for (final CharSequence str : strs) { + if (StrUtil.isBlank(str)) { + return true; + } + } + return false; + } + + /** + * @param strs 字符串列表 + * @return 批量判断字符串是否全部为空白 + * @since 6.0.1 + */ + public static boolean isAllBlank(final Iterable strs) { + if (CollUtil.isNotEmpty(strs)) { + for (final CharSequence str : strs) { + if (StrUtil.isNotBlank(str)) { + return false; + } + } + } + return true; + } + /** * 根据集合返回一个元素计数的 {@link Map}
* 所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
@@ -187,8 +224,8 @@ public class IterUtil { @SuppressWarnings("unchecked") public static Map fieldValueAsMap(final Iterator iter, final String fieldNameForKey, final String fieldNameForValue) { return MapUtil.putAll(new HashMap<>(), iter, - (value) -> (K) FieldUtil.getFieldValue(value, fieldNameForKey), - (value) -> (V) FieldUtil.getFieldValue(value, fieldNameForValue) + (value) -> (K) FieldUtil.getFieldValue(value, fieldNameForKey), + (value) -> (V) FieldUtil.getFieldValue(value, fieldNameForValue) ); } @@ -256,10 +293,10 @@ public class IterUtil { */ public static String join(final Iterator iterator, final CharSequence conjunction, final String prefix, final String suffix) { return StrJoiner.of(conjunction, prefix, suffix) - // 每个元素都添加前后缀 - .setWrapElement(true) - .append(iterator) - .toString(); + // 每个元素都添加前后缀 + .setWrapElement(true) + .append(iterator) + .toString(); } /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/Convert.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/Convert.java index 5bc197738..163625d1c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/Convert.java @@ -12,6 +12,7 @@ package org.dromara.hutool.core.convert; +import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.classloader.ClassLoaderUtil; import org.dromara.hutool.core.codec.HexUtil; import org.dromara.hutool.core.convert.impl.CollectionConverter; @@ -946,7 +947,7 @@ public class Convert { * @see CharsetUtil#convert(String, String, String) */ public static String convertCharset(final String str, final String sourceCharset, final String destCharset) { - if (StrUtil.hasBlank(str, sourceCharset, destCharset)) { + if (ArrayUtil.hasBlank(str, sourceCharset, destCharset)) { return str; } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java index f2ac376f9..a1272241f 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java @@ -12,6 +12,7 @@ package org.dromara.hutool.core.regex; +import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.collection.set.SetUtil; import org.dromara.hutool.core.comparator.CompareUtil; import org.dromara.hutool.core.comparator.StrLengthComparator; @@ -376,7 +377,7 @@ public class ReUtil { * @return 删除后剩余的内容 */ public static String delFirst(final String regex, final CharSequence content) { - if (StrUtil.hasBlank(regex, content)) { + if (ArrayUtil.hasBlank(regex, content)) { return StrUtil.str(content); } @@ -421,7 +422,7 @@ public class ReUtil { * @since 5.6.5 */ public static String delLast(final String regex, final CharSequence str) { - if (StrUtil.hasBlank(regex, str)) { + if (ArrayUtil.hasBlank(regex, str)) { return StrUtil.str(str); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java b/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java index 3e30d28cf..929d8a6ae 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java @@ -17,7 +17,7 @@ import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.resource.MultiResource; import org.dromara.hutool.core.io.resource.Resource; import org.dromara.hutool.core.io.resource.ResourceUtil; -import org.dromara.hutool.core.util.CharUtil; +import org.dromara.hutool.core.text.StrUtil; import java.io.BufferedReader; import java.io.IOException; @@ -99,6 +99,7 @@ public class ListServiceLoader extends AbsServiceLoader { @Override public void load() { + // 解析同名的所有service资源 final MultiResource resources = ResourceUtil.getResources( pathPrefix + serviceClass.getName(), this.classLoader); @@ -112,43 +113,72 @@ public class ListServiceLoader extends AbsServiceLoader { return this.serviceNames.size(); } - private void parse(final Resource resource){ - try(final BufferedReader reader = resource.getReader(this.charset)){ + /** + * 解析一个资源,一个资源对应一个service文件 + * + * @param resource 资源 + */ + private void parse(final Resource resource) { + try (final BufferedReader reader = resource.getReader(this.charset)) { int lc = 1; - while(lc >= 0){ - lc = parseLine(resource, reader, lc, this.serviceNames); + while (lc >= 0) { + lc = parseLine(resource, reader, lc); } } catch (final IOException e) { throw new IORuntimeException(e); } } - private int parseLine(final Resource resource, final BufferedReader r, final int lc, - final List names) + /** + * 解析一行 + * + * @param resource 资源 + * @param reader {@link BufferedReader} + * @param lineNo 行号 + * @return 下一个行号,-1表示读取完毕 + * @throws IOException IO异常 + */ + private int parseLine(final Resource resource, final BufferedReader reader, final int lineNo) throws IOException { - String ln = r.readLine(); - if (ln == null) { + String line = reader.readLine(); + if (line == null) { + // 结束 return -1; } - final int ci = ln.indexOf('#'); - if (ci >= 0) ln = ln.substring(0, ci); - ln = ln.trim(); - final int n = ln.length(); - if (n != 0) { - if ((ln.indexOf(CharUtil.SPACE) >= 0) || (ln.indexOf(CharUtil.TAB) >= 0)) - fail(resource, lc, "Illegal configuration-file syntax"); - int cp = ln.codePointAt(0); - if (!Character.isJavaIdentifierStart(cp)) - fail(resource, lc, "Illegal provider-class name: " + ln); - for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) { - cp = ln.codePointAt(i); - if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) - fail(resource, lc, "Illegal provider-class name: " + ln); - } - if (!serviceCache.containsKey(ln) && !names.contains(ln)) - names.add(ln); + final int ci = line.indexOf('#'); + if (ci >= 0) { + // 截取去除注释部分 + // 当注释单独成行,则此行长度为0,跳过,读取下一行 + line = line.substring(0, ci); + } + line = StrUtil.trim(line); + if (line.length() > 0) { + // 检查行 + checkLine(resource, lineNo, line); + // 不覆盖模式 + final List names = this.serviceNames; + if (!serviceCache.containsKey(line) && !names.contains(line)) { + names.add(line); + } + } + return lineNo + 1; + } + + private void checkLine(final Resource resource, final int lineNo, final String line) { + if (StrUtil.containsBlank(line)) { + fail(resource, lineNo, "Illegal configuration-file syntax"); + } + int cp = line.codePointAt(0); + if (!Character.isJavaIdentifierStart(cp)) { + fail(resource, lineNo, "Illegal provider-class name: " + line); + } + final int n = line.length(); + for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) { + cp = line.codePointAt(i); + if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) { + fail(resource, lineNo, "Illegal provider-class name: " + line); + } } - return lc + 1; } private void fail(final Resource resource, final int line, final String msg) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java index 65db3bad5..d4fa4117d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java @@ -44,7 +44,31 @@ import java.util.function.Predicate; import java.util.function.Supplier; /** - * {@link CharSequence} 相关工具类封装 + * {@link CharSequence} 相关工具类封装,包括但不限于: + *
    + *
  • 字符串补充前缀或后缀:addXXX
  • + *
  • 字符串补充长度:padXXX
  • + *
  • 字符串包含关系:containsXXX
  • + *
  • 字符串默认值:defaultIfXXX
  • + *
  • 字符串查找:indexOf
  • + *
  • 字符串判断以什么结尾:endWith
  • + *
  • 字符串判断以什么开始:startWith
  • + *
  • 字符串匹配:equals
  • + *
  • 字符串格式化:format
  • + *
  • 字符串去除:removeXXX
  • + *
  • 字符串重复:repeat
  • + *
  • 获取子串:sub
  • + *
  • 去除两边的指定字符串(只去除一次):strip
  • + *
  • 去除两边的指定所有字符:trim
  • + *
  • 去除两边的指定所有字符包装和去除包装:wrap
  • + *
+ * + * 需要注意的是,strip、trim、wrap(unWrap)的策略不同: + *
    + *
  • strip: 强调去除两边或某一边的指定字符串,这个字符串不会重复去除,如果一边不存在,另一边不影响去除
  • + *
  • trim: 强调去除两边指定字符,如果这个字符有多个,全部去除,例如去除两边所有的空白符。
  • + *
  • unWrap:强调去包装,要求包装的前后字符都要存在,只有一个则不做处理,如去掉双引号包装。
  • + *
* * @author looly * @since 5.5.3 @@ -73,6 +97,8 @@ public class CharSequenceUtil extends StrChecker { return null == cs ? null : cs.toString(); } + // region ----- defaultIf + /** * 当给定字符串为null时,转换为Empty * @@ -171,6 +197,7 @@ public class CharSequenceUtil extends StrChecker { } return handler.apply(str); } + // endregion // region ----- trim @@ -427,7 +454,7 @@ public class CharSequenceUtil extends StrChecker { */ public static boolean startWith(final CharSequence str, final CharSequence prefix, final boolean ignoreCase, final boolean ignoreEquals) { return new StrRegionMatcher(ignoreCase, ignoreEquals, true) - .test(str, prefix); + .test(str, prefix); } // endregion @@ -539,7 +566,7 @@ public class CharSequenceUtil extends StrChecker { */ public static boolean endWith(final CharSequence str, final CharSequence suffix, final boolean ignoreCase, final boolean ignoreEquals) { return new StrRegionMatcher(ignoreCase, ignoreEquals, false) - .test(str, suffix); + .test(str, suffix); } // endregion @@ -926,7 +953,7 @@ public class CharSequenceUtil extends StrChecker { } } return StrFinder.of(searchStr, ignoreCase) - .setText(text).setNegative(true).start(from); + .setText(text).setNegative(true).start(from); } /** @@ -1198,7 +1225,8 @@ public class CharSequenceUtil extends StrChecker { } /** - * 去除两边的指定字符串 + * 去除两边的指定字符串
+ * 两边字符如果存在,则去除,不存在不做处理 * * @param str 被处理的字符串 * @param prefix 前缀 @@ -1776,8 +1804,8 @@ public class CharSequenceUtil extends StrChecker { */ public static String[] subBetweenAll(final CharSequence str, final CharSequence prefix, final CharSequence suffix) { if (hasEmpty(str, prefix, suffix) || - // 不包含起始字符串,则肯定没有子串 - !contains(str, prefix)) { + // 不包含起始字符串,则肯定没有子串 + !contains(str, prefix)) { return new String[0]; } @@ -3492,8 +3520,8 @@ public class CharSequenceUtil extends StrChecker { final int preLength = suffixLength + (maxLength - 3) % 2; // suffixLength 或 suffixLength + 1 final String str2 = str.toString(); return format("{}...{}", - str2.substring(0, preLength), - str2.substring(strLength - suffixLength)); + str2.substring(0, preLength), + str2.substring(strLength - suffixLength)); } /** @@ -3558,15 +3586,15 @@ public class CharSequenceUtil extends StrChecker { if (moveLength > 0) { final int endAfterMove = Math.min(endExclude + moveLength, str.length()); strBuilder.append(str.subSequence(0, startInclude))// - .append(str.subSequence(endExclude, endAfterMove))// - .append(str.subSequence(startInclude, endExclude))// - .append(str.subSequence(endAfterMove, str.length())); + .append(str.subSequence(endExclude, endAfterMove))// + .append(str.subSequence(startInclude, endExclude))// + .append(str.subSequence(endAfterMove, str.length())); } else if (moveLength < 0) { final int startAfterMove = Math.max(startInclude + moveLength, 0); strBuilder.append(str.subSequence(0, startAfterMove))// - .append(str.subSequence(startInclude, endExclude))// - .append(str.subSequence(startAfterMove, startInclude))// - .append(str.subSequence(endExclude, str.length())); + .append(str.subSequence(startInclude, endExclude))// + .append(str.subSequence(startAfterMove, startInclude))// + .append(str.subSequence(endExclude, str.length())); } else { return str(str); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrChecker.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrChecker.java index 7215f702b..f7a9d67d5 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrChecker.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrChecker.java @@ -61,7 +61,7 @@ public class StrChecker { *

建议:

*
    *
  • 该方法建议仅对于客户端(或第三方接口)传入的参数使用该方法。
  • - *
  • 需要同时校验多个字符串时,建议采用 {@link #hasBlank(CharSequence...)} 或 {@link #isAllBlank(CharSequence...)}
  • + *
  • 需要同时校验多个字符串时,建议采用 {@link ArrayUtil#hasBlank(CharSequence...)} 或 {@link ArrayUtil#isAllBlank(CharSequence...)}
  • *
* * @param str 被检测的字符串 @@ -127,113 +127,6 @@ public class StrChecker { return false; } - /** - *

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

- *

如果指定的字符串数组的长度为 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; - } - /** *

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

*
    @@ -429,17 +322,6 @@ public class StrChecker { return !hasEmpty(args); } - /** - * 是否存都不为{@code null}或空对象或空白符的对象,通过{@link #hasBlank(CharSequence...)} 判断元素 - * - * @param args 被检查的对象,一个或者多个 - * @return 是否都不为空 - * @since 5.3.6 - */ - public static boolean isAllNotBlank(final CharSequence... args) { - return !hasBlank(args); - } - /** * 检查字符串是否为null、“null”、“undefined” * 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 833e48742..b2460c884 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 @@ -22,7 +22,8 @@ import java.nio.charset.Charset; import java.util.Map; /** - * 字符串工具类 + * 字符串工具类
    + * 此工具主要针对单个字符串的操作 * * @author xiaoleilu */ diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/IterUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/IterUtilTest.java deleted file mode 100644 index b1d4b1ec6..000000000 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/IterUtilTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.dromara.hutool.core.collection; - -import org.dromara.hutool.core.collection.iter.FilterIter; -import org.dromara.hutool.core.collection.iter.IterUtil; -import lombok.AllArgsConstructor; -import lombok.Data; -import org.dromara.hutool.core.collection.set.SetUtil; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.*; - -/** - * {@link IterUtil} 单元测试 - * - * @author looly - */ -public class IterUtilTest { - - @Test - public void getFirstNonNullTest() { - final List strings = ListUtil.of(null, null, "123", "456", null); - Assertions.assertEquals("123", CollUtil.getFirstNoneNull(strings)); - } - - @Test - public void fieldValueMapTest() { - final List carList = ListUtil.of(new Car("123", "大众"), new Car("345", "奔驰"), new Car("567", "路虎")); - final Map carNameMap = IterUtil.fieldValueMap(carList.iterator(), "carNumber"); - - Assertions.assertEquals("大众", carNameMap.get("123").getCarName()); - Assertions.assertEquals("奔驰", carNameMap.get("345").getCarName()); - Assertions.assertEquals("路虎", carNameMap.get("567").getCarName()); - } - - @Test - public void joinTest() { - final List list = ListUtil.of("1", "2", "3", "4"); - final String join = IterUtil.join(list.iterator(), ":"); - Assertions.assertEquals("1:2:3:4", join); - - final List list1 = ListUtil.of(1, 2, 3, 4); - final String join1 = IterUtil.join(list1.iterator(), ":"); - Assertions.assertEquals("1:2:3:4", join1); - - // 包装每个节点 - final List list2 = ListUtil.of("1", "2", "3", "4"); - final String join2 = IterUtil.join(list2.iterator(), ":", "\"", "\""); - Assertions.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2); - } - - @Test - public void joinWithFuncTest() { - final List list = ListUtil.of("1", "2", "3", "4"); - final String join = IterUtil.join(list.iterator(), ":", String::valueOf); - Assertions.assertEquals("1:2:3:4", join); - } - - @Test - public void joinWithNullTest() { - final List list = ListUtil.of("1", null, "3", "4"); - final String join = IterUtil.join(list.iterator(), ":", String::valueOf); - Assertions.assertEquals("1:null:3:4", join); - } - - @Test - public void testToListMap() { - final Map> expectedMap = new HashMap<>(); - expectedMap.put("a", Collections.singletonList("and")); - expectedMap.put("b", Arrays.asList("brave", "back")); - - final Map> testMap = IterUtil.toListMap(Arrays.asList("and", "brave", "back"), - v -> v.substring(0, 1)); - Assertions.assertEquals(testMap, expectedMap); - } - - @Test - public void testToMap() { - final Map expectedMap = new HashMap<>(); - - final Car bmw = new Car("123", "bmw"); - expectedMap.put("123", bmw); - - final Car benz = new Car("456", "benz"); - expectedMap.put("456", benz); - - final Map testMap = IterUtil.toMap(Arrays.asList(bmw, benz), Car::getCarNumber); - Assertions.assertEquals(expectedMap, testMap); - } - - @Test - public void getElementTypeTest() { - final List integers = Arrays.asList(null, 1); - final Class elementType = IterUtil.getElementType(integers); - Assertions.assertEquals(Integer.class, elementType); - } - - @Data - @AllArgsConstructor - public static class Car { - private String carNumber; - private String carName; - } - - @Test - public void removeTest() { - final List obj2 = ListUtil.of("3"); - final List obj = ListUtil.of("1", "3"); - - IterUtil.remove(obj.iterator(), (e)-> !obj2.contains(e)); - - Assertions.assertEquals(1, obj.size()); - Assertions.assertEquals("3", obj.get(0)); - } - - @Test - public void filteredTest() { - final List obj2 = ListUtil.of("3"); - final List obj = ListUtil.of("1", "3"); - - final FilterIter filtered = IterUtil.filtered(obj.iterator(), obj2::contains); - - Assertions.assertEquals("3", filtered.next()); - Assertions.assertFalse(filtered.hasNext()); - } - - @Test - public void filterToListTest() { - final List obj2 = ListUtil.of("3"); - final List obj = ListUtil.of("1", "3"); - - final List filtered = IterUtil.filterToList(obj.iterator(), obj2::contains); - - Assertions.assertEquals(1, filtered.size()); - Assertions.assertEquals("3", filtered.get(0)); - } - - @Test - public void getTest() { - final HashSet set = SetUtil.ofLinked("A", "B", "C", "D"); - final String str = IterUtil.get(set.iterator(), 2); - Assertions.assertEquals("C", str); - } -} diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/iter/IterUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/iter/IterUtilTest.java index e39a99de8..26461cb48 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/iter/IterUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/iter/IterUtilTest.java @@ -1,6 +1,11 @@ package org.dromara.hutool.core.collection.iter; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.RequiredArgsConstructor; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.collection.ListUtil; +import org.dromara.hutool.core.collection.set.SetUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.w3c.dom.NodeList; @@ -64,27 +69,27 @@ public class IterUtilTest { @Test public void testCountMap() { - Object o1 = new Object(); - Object o2 = new Object(); - Map countMap = IterUtil.countMap(Arrays.asList(o1, o2, o1, o1).iterator()); + final Object o1 = new Object(); + final Object o2 = new Object(); + final Map countMap = IterUtil.countMap(Arrays.asList(o1, o2, o1, o1).iterator()); Assertions.assertEquals((Integer)3, countMap.get(o1)); Assertions.assertEquals((Integer)1, countMap.get(o2)); } @Test public void testFieldValueMap() { - Bean bean1 = new Bean(1, "A"); - Bean bean2 = new Bean(2, "B"); - Map map = IterUtil.fieldValueMap(Arrays.asList(bean1, bean2).iterator(), "id"); + final Bean bean1 = new Bean(1, "A"); + final Bean bean2 = new Bean(2, "B"); + final Map map = IterUtil.fieldValueMap(Arrays.asList(bean1, bean2).iterator(), "id"); Assertions.assertEquals(bean1, map.get(1)); Assertions.assertEquals(bean2, map.get(2)); } @Test public void testFieldValueAsMap() { - Bean bean1 = new Bean(1, "A"); - Bean bean2 = new Bean(2, "B"); - Map map = IterUtil.fieldValueAsMap( + final Bean bean1 = new Bean(1, "A"); + final Bean bean2 = new Bean(2, "B"); + final Map map = IterUtil.fieldValueAsMap( Arrays.asList(bean1, bean2).iterator(), "id", "name" ); Assertions.assertEquals("A", map.get(1)); @@ -93,8 +98,8 @@ public class IterUtilTest { @Test public void testFieldValueList() { - Bean bean1 = new Bean(1, "A"); - Bean bean2 = new Bean(2, "B"); + final Bean bean1 = new Bean(1, "A"); + final Bean bean2 = new Bean(2, "B"); Assertions.assertEquals(Arrays.asList(1, 2), IterUtil.fieldValueList(Arrays.asList(bean1, bean2), "id")); Assertions.assertEquals( Arrays.asList(1, 2), @@ -104,7 +109,7 @@ public class IterUtilTest { @Test public void testJoin() { - List stringList = Arrays.asList("1", "2", "3"); + final List stringList = Arrays.asList("1", "2", "3"); Assertions.assertEquals("123", IterUtil.join(stringList.iterator(), "")); Assertions.assertEquals("-1--2--3-", IterUtil.join(stringList.iterator(), "", "-", "-")); Assertions.assertEquals("123", IterUtil.join(stringList.iterator(), "", Function.identity())); @@ -112,7 +117,7 @@ public class IterUtilTest { @Test public void testToMap() { - List keys = Arrays.asList(1, 2, 3); + final List keys = Arrays.asList(1, 2, 3); Map map = IterUtil.toMap(keys, keys); Assertions.assertEquals(keys, new ArrayList<>(map.keySet())); @@ -141,7 +146,7 @@ public class IterUtilTest { @Test public void testToListMap() { - List keys = Arrays.asList(1, 2, 3, 4); + final List keys = Arrays.asList(1, 2, 3, 4); Map> map = IterUtil.toListMap(keys, i -> (i & 1) == 0, Function.identity()); Assertions.assertEquals(Arrays.asList(2, 4), map.get(true)); @@ -152,20 +157,32 @@ public class IterUtilTest { Assertions.assertEquals(Arrays.asList(1, 3), map.get(false)); map = new LinkedHashMap<>(); - Map> rawMap = IterUtil.toListMap(map, keys, i -> (i & 1) == 0, Function.identity()); + final Map> rawMap = IterUtil.toListMap(map, keys, i -> (i & 1) == 0, Function.identity()); Assertions.assertSame(rawMap, map); Assertions.assertEquals(Arrays.asList(2, 4), rawMap.get(true)); Assertions.assertEquals(Arrays.asList(1, 3), rawMap.get(false)); } + @Test + public void testToListMap2() { + final Map> expectedMap = new HashMap<>(); + expectedMap.put("a", Collections.singletonList("and")); + expectedMap.put("b", Arrays.asList("brave", "back")); + + final Map> testMap = IterUtil.toListMap(Arrays.asList("and", "brave", "back"), + v -> v.substring(0, 1)); + Assertions.assertEquals(testMap, expectedMap); + } + + @SuppressWarnings("DataFlowIssue") @Test public void testAsIterable() { - Iterator iter = Arrays.asList(1, 2, 3).iterator(); + final Iterator iter = Arrays.asList(1, 2, 3).iterator(); Assertions.assertEquals(iter, IterUtil.asIterable(iter).iterator()); Assertions.assertNull(IterUtil.asIterable(null).iterator()); - Enumeration enumeration = new IteratorEnumeration<>(iter); - Iterator iter2 = IterUtil.asIterator(enumeration); + final Enumeration enumeration = new IteratorEnumeration<>(iter); + final Iterator iter2 = IterUtil.asIterator(enumeration); Assertions.assertEquals((Integer)1, iter2.next()); Assertions.assertEquals((Integer)2, iter2.next()); Assertions.assertEquals((Integer)3, iter2.next()); @@ -173,14 +190,14 @@ public class IterUtilTest { @Test public void testGet() { - Iterator iter = Arrays.asList(1, 2, 3, 4).iterator(); + final Iterator iter = Arrays.asList(1, 2, 3, 4).iterator(); Assertions.assertEquals((Integer)3, IterUtil.get(iter, 2)); Assertions.assertThrows(IllegalArgumentException.class, () -> IterUtil.get(iter, -1)); } @Test public void testGetFirst() { - Iterator iter = Arrays.asList(1, 2, 3, 4).iterator(); + final Iterator iter = Arrays.asList(1, 2, 3, 4).iterator(); Assertions.assertEquals((Integer)1, IterUtil.getFirst(iter)); Assertions.assertNull(IterUtil.getFirst(null)); Assertions.assertNull(IterUtil.getFirst(Collections.emptyIterator())); @@ -192,7 +209,7 @@ public class IterUtilTest { @Test public void testGetFirstNoneNull() { - Iterator iter = Arrays.asList(null, 2, null, 4).iterator(); + final Iterator iter = Arrays.asList(null, 2, null, 4).iterator(); Assertions.assertEquals((Integer)2, IterUtil.getFirstNoneNull(iter)); Assertions.assertNull(IterUtil.getFirstNoneNull(null)); Assertions.assertNull(IterUtil.getFirstNoneNull(Collections.emptyIterator())); @@ -200,7 +217,7 @@ public class IterUtilTest { @Test public void testGetElementType() { - List list = Arrays.asList(null, "str", null); + final List list = Arrays.asList(null, "str", null); Assertions.assertEquals(String.class, IterUtil.getElementType(list)); Assertions.assertNull(IterUtil.getElementType((Iterable)null)); Assertions.assertNull(IterUtil.getElementType(Collections.emptyList())); @@ -225,16 +242,15 @@ public class IterUtilTest { @Test public void testRemove() { - List list = new ArrayList<>(Arrays.asList(1, null, null, 3)); + final List list = new ArrayList<>(Arrays.asList(1, null, null, 3)); IterUtil.remove(list.iterator(), Objects::isNull); Assertions.assertEquals(Arrays.asList(1, 3), list); } @Test public void testFilterToList() { - List list1 = new ArrayList<>(Arrays.asList(1, null, null, 3)); - List list2 = IterUtil.filterToList(list1.iterator(), Objects::nonNull); - Assertions.assertSame(list1, list1); + final List list1 = new ArrayList<>(Arrays.asList(1, null, null, 3)); + final List list2 = IterUtil.filterToList(list1.iterator(), Objects::nonNull); Assertions.assertEquals(Arrays.asList(1, 3), list2); } @@ -276,7 +292,7 @@ public class IterUtilTest { @Test public void testClear() { - List list = new ArrayList<>(Arrays.asList(1, 2, 3)); + final List list = new ArrayList<>(Arrays.asList(1, 2, 3)); IterUtil.clear(list.iterator()); Assertions.assertTrue(list.isEmpty()); Assertions.assertThrows(UnsupportedOperationException.class, () -> IterUtil.clear(Arrays.asList(1, 2).iterator())); @@ -284,7 +300,7 @@ public class IterUtilTest { @Test public void testToStr() { - List list = Arrays.asList(1, 2, 3); + final List list = Arrays.asList(1, 2, 3); Assertions.assertEquals("[1, 2, 3]", IterUtil.toStr(list.iterator())); Assertions.assertEquals("[1, 2, 3]", IterUtil.toStr(list.iterator(), Objects::toString)); Assertions.assertEquals("{1:2:3}", IterUtil.toStr(list.iterator(), Objects::toString, ":", "{", "}")); @@ -292,15 +308,133 @@ public class IterUtilTest { @Test public void testForEach() { - List list = new ArrayList<>(); + final List list = new ArrayList<>(); IterUtil.forEach(Arrays.asList(1, 2, 3, 4).iterator(), list::add); Assertions.assertEquals(Arrays.asList(1, 2, 3, 4), list); } + @SuppressWarnings("unused") @RequiredArgsConstructor private static class Bean { private final Integer id; private final String name; } + @Test + public void getFirstNonNullTest() { + final List strings = ListUtil.of(null, null, "123", "456", null); + Assertions.assertEquals("123", CollUtil.getFirstNoneNull(strings)); + } + + @Test + public void fieldValueMapTest() { + final List carList = ListUtil.of( + new Car("123", "大众"), + new Car("345", "奔驰"), + new Car("567", "路虎")); + final Map carNameMap = IterUtil.fieldValueMap(carList.iterator(), "carNumber"); + + Assertions.assertEquals("大众", carNameMap.get("123").getCarName()); + Assertions.assertEquals("奔驰", carNameMap.get("345").getCarName()); + Assertions.assertEquals("路虎", carNameMap.get("567").getCarName()); + } + + @Test + public void joinTest() { + final List list = ListUtil.of("1", "2", "3", "4"); + final String join = IterUtil.join(list.iterator(), ":"); + Assertions.assertEquals("1:2:3:4", join); + + final List list1 = ListUtil.of(1, 2, 3, 4); + final String join1 = IterUtil.join(list1.iterator(), ":"); + Assertions.assertEquals("1:2:3:4", join1); + + // 包装每个节点 + final List list2 = ListUtil.of("1", "2", "3", "4"); + final String join2 = IterUtil.join(list2.iterator(), ":", "\"", "\""); + Assertions.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2); + } + + @Test + public void joinWithFuncTest() { + final List list = ListUtil.of("1", "2", "3", "4"); + final String join = IterUtil.join(list.iterator(), ":", String::valueOf); + Assertions.assertEquals("1:2:3:4", join); + } + + @Test + public void joinWithNullTest() { + final List list = ListUtil.of("1", null, "3", "4"); + final String join = IterUtil.join(list.iterator(), ":", String::valueOf); + Assertions.assertEquals("1:null:3:4", join); + } + + @Test + public void testToMap2() { + final Map expectedMap = new HashMap<>(); + + final Car bmw = new Car("123", "bmw"); + expectedMap.put("123", bmw); + + final Car benz = new Car("456", "benz"); + expectedMap.put("456", benz); + + final Map testMap = IterUtil.toMap(Arrays.asList(bmw, benz), Car::getCarNumber); + Assertions.assertEquals(expectedMap, testMap); + } + + @Test + public void getElementTypeTest() { + final List integers = Arrays.asList(null, 1); + final Class elementType = IterUtil.getElementType(integers); + Assertions.assertEquals(Integer.class, elementType); + } + + @Data + @AllArgsConstructor + public static class Car { + private String carNumber; + private String carName; + } + + @Test + public void removeTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); + + IterUtil.remove(obj.iterator(), (e)-> !obj2.contains(e)); + + Assertions.assertEquals(1, obj.size()); + Assertions.assertEquals("3", obj.get(0)); + } + + @Test + public void filteredTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); + + final FilterIter filtered = IterUtil.filtered(obj.iterator(), obj2::contains); + + Assertions.assertEquals("3", filtered.next()); + Assertions.assertFalse(filtered.hasNext()); + } + + @Test + public void filterToListTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); + + final List filtered = IterUtil.filterToList(obj.iterator(), obj2::contains); + + Assertions.assertEquals(1, filtered.size()); + Assertions.assertEquals("3", filtered.get(0)); + } + + @Test + public void getTest() { + final HashSet set = SetUtil.ofLinked("A", "B", "C", "D"); + final String str = IterUtil.get(set.iterator(), 2); + Assertions.assertEquals("C", str); + } + } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java index 6df156e88..ba34e5a59 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java @@ -7,7 +7,6 @@ import org.dromara.hutool.core.util.RandomUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.LinkedList; import java.util.List; /** @@ -618,50 +617,6 @@ public class StrUtilTest { Assertions.assertEquals("/", result); } - @Test - public void testIsAllBlank() { - final List queue = new LinkedList<>(); - queue.add("apple"); - queue.add("banana"); - queue.add("cherry"); - queue.add("orange"); - queue.add("strawberry"); - queue.add("watermelon"); - Assertions.assertFalse(StrUtil.isAllBlank(queue)); - - Assertions.assertTrue(CharSequenceUtil.isAllBlank("")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank(" ")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\t")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\n")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\r")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\f")); - Assertions.assertFalse(CharSequenceUtil.isAllBlank("\b")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u00A0")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\uFEFF")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2000")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2001")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2002")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2003")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2004")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2005")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2006")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2007")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2008")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2009")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u200A")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u3000")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\uFEFF")); - - // 其他空白字符 - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u000B")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u000C")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u00A0")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u1680")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u180E")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2000")); - Assertions.assertTrue(CharSequenceUtil.isAllBlank("\u2001")); - } - @Test public void issue2628Test(){ final String s = StrUtil.indexedFormat("a{0,number,#}", 1234567); diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java index 2cd5f1948..0de70e9e8 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java @@ -108,7 +108,7 @@ public class AnsiSqlDialect implements Dialect { @Override public PreparedStatement psForPage(final Connection conn, final Query query) throws SQLException { Assert.notNull(query, "query must be not null !"); - if (StrUtil.hasBlank(query.getTableNames())) { + if (ArrayUtil.hasBlank(query.getTableNames())) { throw new DbRuntimeException("Table name must be not empty !"); } diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlBuilder.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlBuilder.java index c7f11a471..5f2444c99 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlBuilder.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlBuilder.java @@ -338,7 +338,7 @@ public class SqlBuilder implements Builder { * @return 自己 */ public SqlBuilder from(String... tableNames) { - if (ArrayUtil.isEmpty(tableNames) || StrUtil.hasBlank(tableNames)) { + if (ArrayUtil.isEmpty(tableNames) || ArrayUtil.hasBlank(tableNames)) { throw new DbRuntimeException("Table name is blank in table names !"); }