From a745f1be8086e5f45b3e3e7da94c422f2677640a Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 26 Mar 2023 17:15:17 +0800 Subject: [PATCH] fix code --- .../cn/hutool/core/bean/BeanInfoCache.java | 3 + .../java/cn/hutool/core/bean/BeanPath.java | 9 +- .../main/java/cn/hutool/core/codec/Morse.java | 3 +- .../java/cn/hutool/core/codec/PunyCode.java | 8 +- .../cn/hutool/core/collection/CollUtil.java | 36 +- .../core/comparator/VersionComparator.java | 8 +- .../core/convert/impl/ArrayConverter.java | 4 +- .../java/cn/hutool/core/date/DateUtil.java | 11 +- .../cn/hutool/core/io/file/FileNameUtil.java | 3 +- .../java/cn/hutool/core/io/file/FileUtil.java | 5 +- .../java/cn/hutool/core/net/Ipv4Pool.java | 4 +- .../java/cn/hutool/core/net/Ipv4Util.java | 5 +- .../main/java/cn/hutool/core/net/NetUtil.java | 6 +- .../java/cn/hutool/core/net/url/UrlPath.java | 3 +- .../cn/hutool/core/reflect/ClassUtil.java | 3 +- .../cn/hutool/core/text/AntPathMatcher.java | 3 +- .../cn/hutool/core/text/CharSequenceUtil.java | 350 +------------- .../java/cn/hutool/core/text/StrEditor.java | 5 - .../java/cn/hutool/core/text/StrRepeater.java | 164 +++++++ .../hutool/core/text/dfa/SensitiveUtil.java | 13 +- .../cn/hutool/core/text/split/SplitUtil.java | 435 ++++++------------ .../hutool/core/codec/hash/SimhashTest.java | 5 +- .../cn/hutool/core/text/SplitUtilTest.java | 50 ++ .../cn/hutool/core/text/StrRepeaterTest.java | 21 + .../java/cn/hutool/core/text/StrUtilTest.java | 55 +-- .../core/text/split/StrSplitterTest.java | 24 +- .../cron/pattern/parser/PartParser.java | 14 +- .../cron/pattern/parser/PatternParser.java | 4 +- .../main/java/cn/hutool/db/sql/Condition.java | 17 +- .../java/cn/hutool/db/sql/QuoteWrapper.java | 8 +- .../java/cn/hutool/db/meta/MetaUtilTest.java | 3 +- .../java/cn/hutool/extra/mail/MailUtil.java | 5 +- .../extra/management/JavaRuntimeInfo.java | 26 +- .../cn/hutool/extra/pinyin/PinyinEngine.java | 3 +- .../cn/hutool/http/webservice/SoapClient.java | 3 +- .../java/cn/hutool/json/InternalJSONUtil.java | 3 +- .../src/main/java/cn/hutool/json/jwt/JWT.java | 4 +- .../java/cn/hutool/setting/AbsSetting.java | 3 +- .../java/cn/hutool/setting/SettingLoader.java | 8 +- .../cn/hutool/swing/img/color/ColorUtil.java | 25 +- 40 files changed, 550 insertions(+), 812 deletions(-) delete mode 100644 hutool-core/src/main/java/cn/hutool/core/text/StrEditor.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/text/StrRepeater.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/text/StrRepeaterTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java index 23864073f..c9f484070 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java @@ -14,6 +14,9 @@ import java.util.Map; * @author Looly */ public enum BeanInfoCache { + /** + * 单例 + */ INSTANCE; private final WeakConcurrentMap, Map> pdCache = new WeakConcurrentMap<>(); diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java index ce8e3e58c..ed6f718b2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java @@ -6,6 +6,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.math.NumberUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; @@ -190,9 +191,9 @@ public class BeanPath implements Serializable { return null; } - if (StrUtil.contains(expression, ':')) { + if (StrUtil.contains(expression, CharUtil.COLON)) { // [start:end:step] 模式 - final List parts = StrUtil.splitTrim(expression, ':'); + final List parts = SplitUtil.splitTrim(expression, StrUtil.COLON); final int start = Integer.parseInt(parts.get(0)); final int end = Integer.parseInt(parts.get(1)); int step = 1; @@ -206,7 +207,7 @@ public class BeanPath implements Serializable { } } else if (StrUtil.contains(expression, ',')) { // [num0,num1,num2...]模式或者['key0','key1']模式 - final List keys = StrUtil.splitTrim(expression, ','); + final List keys = SplitUtil.splitTrim(expression, StrUtil.COMMA); if (bean instanceof Collection) { return CollUtil.getAny((Collection) bean, Convert.convert(int[].class, keys)); } else if (ArrayUtil.isArray(bean)) { @@ -214,7 +215,7 @@ public class BeanPath implements Serializable { } else { final String[] unWrappedKeys = new String[keys.size()]; for (int i = 0; i < unWrappedKeys.length; i++) { - unWrappedKeys[i] = StrUtil.unWrap(keys.get(i), '\''); + unWrappedKeys[i] = StrUtil.unWrap(keys.get(i), CharUtil.SINGLE_QUOTE); } if (bean instanceof Map) { // 只支持String为key的Map diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java index 1e50431bd..b869c19b0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java @@ -2,6 +2,7 @@ package cn.hutool.core.codec; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import java.util.HashMap; @@ -153,7 +154,7 @@ public class Morse { if (false == StrUtil.containsOnly(morse, dit, dah, split)) { throw new IllegalArgumentException("Incorrect morse."); } - final List words = StrUtil.split(morse, split); + final List words = SplitUtil.split(morse, String.valueOf(split)); final StringBuilder textBuilder = new StringBuilder(); Integer codePoint; for (String word : words) { diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java b/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java index ddc441b50..13f50c110 100644 --- a/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java +++ b/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java @@ -3,6 +3,7 @@ package cn.hutool.core.codec; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import java.util.List; @@ -24,8 +25,7 @@ public class PunyCode { private static final int DAMP = 700; private static final int SKEW = 38; private static final char DELIMITER = '-'; - - public static final String PUNY_CODE_PREFIX = "xn--"; + private static final String PUNY_CODE_PREFIX = "xn--"; /** * 将域名编码为PunyCode,会忽略"."的编码 @@ -36,7 +36,7 @@ public class PunyCode { */ public static String encodeDomain(final String domain) throws UtilException { Assert.notNull(domain, "domain must not be null!"); - final List split = StrUtil.split(domain, CharUtil.DOT); + final List split = SplitUtil.split(domain, StrUtil.DOT); final StringBuilder result = new StringBuilder(domain.length() * 4); for (final String str : split) { if (result.length() != 0) { @@ -156,7 +156,7 @@ public class PunyCode { */ public static String decodeDomain(final String domain) throws UtilException { Assert.notNull(domain, "domain must not be null!"); - final List split = StrUtil.split(domain, CharUtil.DOT); + final List split = SplitUtil.split(domain, StrUtil.DOT); final StringBuilder result = new StringBuilder(domain.length() / 4 + 1); for (final String str : split) { if (result.length() != 0) { diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 531378f2a..b0eaeaa5e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -19,43 +19,17 @@ import cn.hutool.core.reflect.FieldUtil; import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.stream.StreamUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.ObjUtil; import java.lang.reflect.Type; -import java.util.AbstractCollection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Deque; -import java.util.EnumSet; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.NavigableSet; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.SortedSet; -import java.util.Stack; -import java.util.TreeMap; -import java.util.TreeSet; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; +import java.util.function.*; import java.util.stream.Collectors; /** @@ -1350,7 +1324,7 @@ public class CollUtil { * @since 3.0.4 */ public static Map zip(final String keys, final String values, final String delimiter, final boolean isOrder) { - return ArrayUtil.zip(StrUtil.splitToArray(keys, delimiter), StrUtil.splitToArray(values, delimiter), isOrder); + return ArrayUtil.zip(SplitUtil.splitToArray(keys, delimiter), SplitUtil.splitToArray(values, delimiter), isOrder); } /** @@ -1550,7 +1524,7 @@ public class CollUtil { if (value instanceof CharSequence) { // String按照逗号分隔的列表对待 final String arrayStr = StrUtil.unWrap((CharSequence) value, '[', ']'); - iter = StrUtil.splitTrim(arrayStr, CharUtil.COMMA).iterator(); + iter = SplitUtil.splitTrim(arrayStr, StrUtil.COMMA).iterator(); } else { iter = IterUtil.getIter(value); } diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java index 4ea067fb1..3586acbe5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/VersionComparator.java @@ -1,8 +1,8 @@ package cn.hutool.core.comparator; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; +import cn.hutool.core.util.ObjUtil; import java.io.Serializable; import java.util.Comparator; @@ -61,8 +61,8 @@ public class VersionComparator implements Comparator, Serializable { return 1; } - final List v1s = StrUtil.split(version1, CharUtil.DOT); - final List v2s = StrUtil.split(version2, CharUtil.DOT); + final List v1s = SplitUtil.splitTrim(version1, StrUtil.DOT); + final List v2s = SplitUtil.splitTrim(version2, StrUtil.DOT); int diff = 0; final int minLength = Math.min(v1s.size(), v2s.size());// 取最小长度值 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java index 0239f3543..0d4ee925e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java @@ -6,9 +6,9 @@ import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.SerializeUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ByteUtil; -import cn.hutool.core.util.CharUtil; import java.io.Serializable; import java.lang.reflect.Array; @@ -122,7 +122,7 @@ public class ArrayConverter extends AbstractConverter { } // 单纯字符串情况下按照逗号分隔后劈开 - final String[] strings = StrUtil.splitToArray(value.toString(), CharUtil.COMMA); + final String[] strings = SplitUtil.splitToArray(value.toString(), StrUtil.COMMA); return convertArrayToArray(targetComponentType, strings); } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index a20c27a93..b501521b1 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -11,7 +11,7 @@ import cn.hutool.core.math.NumberUtil; import cn.hutool.core.regex.PatternPool; import cn.hutool.core.regex.ReUtil; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.util.CharUtil; +import cn.hutool.core.text.split.SplitUtil; import javax.xml.datatype.XMLGregorianCalendar; import java.text.DateFormat; @@ -502,6 +502,7 @@ public class DateUtil extends CalendarUtil { } // region ----- format + /** * 格式化日期时间
* 格式 yyyy-MM-dd HH:mm:ss @@ -673,6 +674,7 @@ public class DateUtil extends CalendarUtil { // endregion // region ----- parse + /** * 构建DateTime对象 * @@ -829,6 +831,7 @@ public class DateUtil extends CalendarUtil { // endregion // region ----- offset + /** * 修改日期为某个时间字段起始时间 * @@ -1217,6 +1220,7 @@ public class DateUtil extends CalendarUtil { // endregion // region ----- between + /** * 判断两个日期相差的时长,只保留绝对值 * @@ -1325,6 +1329,7 @@ public class DateUtil extends CalendarUtil { // endregion // region ----- formatBetween + /** * 格式化日期间隔输出 * @@ -1626,7 +1631,7 @@ public class DateUtil extends CalendarUtil { return 0; } - final List hms = StrUtil.splitTrim(timeStr, CharUtil.COLON, 3); + final List hms = SplitUtil.split(timeStr, StrUtil.COLON, 3, true, true); final int lastIndex = hms.size() - 1; int result = 0; @@ -2071,7 +2076,7 @@ public class DateUtil extends CalendarUtil { } // 日期时间分开处理 - final List dateAndTime = StrUtil.splitTrim(dateStr, ' '); + final List dateAndTime = SplitUtil.splitTrim(dateStr, StrUtil.SPACE); final int size = dateAndTime.size(); if (size < 1 || size > 2) { // 非可被标准处理的格式 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java index 4ed0f07d8..f12dac33a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.net.url.URLUtil; import cn.hutool.core.regex.ReUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.SystemUtil; @@ -387,7 +388,7 @@ public class FileNameUtil { pathToUse = pathToUse.substring(1); } - final List pathList = StrUtil.split(pathToUse, CharUtil.SLASH); + final List pathList = SplitUtil.split(pathToUse, StrUtil.SLASH); final List pathElements = new LinkedList<>(); int tops = 0; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java index 1536d6870..bb48e3fbf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileUtil.java @@ -14,6 +14,7 @@ import cn.hutool.core.net.url.URLUtil; import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.regex.ReUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.*; @@ -2973,13 +2974,13 @@ public class FileUtil extends PathUtil { */ private static File buildFile(File outFile, String fileName) { // 替换Windows路径分隔符为Linux路径分隔符,便于统一处理 - fileName = fileName.replace('\\', '/'); + fileName = fileName.replace(CharUtil.BACKSLASH, CharUtil.SLASH); if (false == isWindows() // 检查文件名中是否包含"/",不考虑以"/"结尾的情况 && fileName.lastIndexOf(CharUtil.SLASH, fileName.length() - 2) > 0) { // 在Linux下多层目录创建存在问题,/会被当成文件名的一部分,此处做处理 // 使用/拆分路径(zip中无\),级联创建父目录 - final List pathParts = StrUtil.split(fileName, '/', false, true); + final List pathParts = SplitUtil.split(fileName, StrUtil.SLASH, false, true); final int lastPartIndex = pathParts.size() - 1;//目录个数 for (int i = 0; i < lastPartIndex; i++) { //由于路径拆分,slip不检查,在最后一步检查 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Pool.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Pool.java index 172dcd22f..ac191185b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Pool.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Pool.java @@ -1,5 +1,7 @@ package cn.hutool.core.net; +import cn.hutool.core.text.StrUtil; + /** * Ip相关常量 *
@@ -23,7 +25,7 @@ public interface Ipv4Pool {
     /**
      * IP与掩码的分割符
      */
-    String IP_MASK_SPLIT_MARK = "/";
+    String IP_MASK_SPLIT_MARK = StrUtil.SLASH;
 
     /**
      * localhost默认解析的ip地址
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java
index b600a24ec..1855ebd76 100755
--- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.regex.PatternPool;
 import cn.hutool.core.text.StrUtil;
+import cn.hutool.core.text.split.SplitUtil;
 import cn.hutool.core.util.CharUtil;
 
 import java.util.ArrayList;
@@ -54,11 +55,11 @@ public class Ipv4Util implements Ipv4Pool {
 	public static List list(final String ipRange, final boolean isAll) {
 		if (ipRange.contains(IP_SPLIT_MARK)) {
 			// X.X.X.X-X.X.X.X
-			final String[] range = StrUtil.splitToArray(ipRange, IP_SPLIT_MARK);
+			final String[] range = SplitUtil.splitToArray(ipRange, IP_SPLIT_MARK);
 			return list(range[0], range[1]);
 		} else if (ipRange.contains(IP_MASK_SPLIT_MARK)) {
 			// X.X.X.X/X
-			final String[] param = StrUtil.splitToArray(ipRange, IP_MASK_SPLIT_MARK);
+			final String[] param = SplitUtil.splitToArray(ipRange, IP_MASK_SPLIT_MARK);
 			return list(param[0], Integer.parseInt(param[1]), isAll);
 		} else {
 			return ListUtil.of(ipRange);
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
index 480bbc0c5..a22ab2998 100755
--- a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java
@@ -6,6 +6,8 @@ import cn.hutool.core.exceptions.UtilException;
 import cn.hutool.core.io.IORuntimeException;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.text.StrUtil;
+import cn.hutool.core.text.split.SplitUtil;
+import cn.hutool.core.util.CharUtil;
 import cn.hutool.core.util.JNDIUtil;
 import cn.hutool.core.util.RandomUtil;
 
@@ -744,8 +746,8 @@ public class NetUtil {
 	 */
 	public static String getMultistageReverseProxyIp(String ip) {
 		// 多级反向代理检测
-		if (ip != null && StrUtil.indexOf(ip, ',') > 0) {
-			final List ips = StrUtil.splitTrim(ip, ',');
+		if (ip != null && StrUtil.indexOf(ip, CharUtil.COMMA) > 0) {
+			final List ips = SplitUtil.splitTrim(ip, StrUtil.COMMA);
 			for (final String subIp : ips) {
 				if (false == isUnknown(subIp)) {
 					ip = subIp;
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java
index 9684fc72b..71618fac6 100644
--- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java
@@ -3,6 +3,7 @@ package cn.hutool.core.net.url;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.text.split.SplitUtil;
 import cn.hutool.core.util.CharUtil;
 import cn.hutool.core.text.StrUtil;
 import cn.hutool.core.util.ObjUtil;
@@ -114,7 +115,7 @@ public class UrlPath {
 
 			path = fixPath(path);
 			if (StrUtil.isNotEmpty(path)) {
-				final List split = StrUtil.split(path, '/');
+				final List split = SplitUtil.split(path, StrUtil.SLASH);
 				for (final String seg : split) {
 					addInternal(URLDecoder.decodeForPath(seg, charset), false);
 				}
diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
index e40212402..5f59d3eb1 100644
--- a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java
@@ -9,6 +9,7 @@ import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.core.net.url.URLDecoder;
 import cn.hutool.core.net.url.URLUtil;
 import cn.hutool.core.text.StrUtil;
+import cn.hutool.core.text.split.SplitUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.CharUtil;
 import cn.hutool.core.util.CharsetUtil;
@@ -121,7 +122,7 @@ public class ClassUtil {
 	 * @since 4.1.9
 	 */
 	public static String getShortClassName(final String className) {
-		final List packages = StrUtil.split(className, CharUtil.DOT);
+		final List packages = SplitUtil.split(className, StrUtil.DOT);
 		if (null == packages || packages.size() < 2) {
 			return className;
 		}
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/AntPathMatcher.java b/hutool-core/src/main/java/cn/hutool/core/text/AntPathMatcher.java
index 412b94d84..c07e16846 100755
--- a/hutool-core/src/main/java/cn/hutool/core/text/AntPathMatcher.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/AntPathMatcher.java
@@ -424,7 +424,8 @@ public class AntPathMatcher {
 	 * @return the tokenized path parts
 	 */
 	protected String[] tokenizePath(final String path) {
-		return SplitUtil.splitToArray(path, this.pathSeparator, 0, this.trimTokens, true);
+		return SplitUtil.split(path, this.pathSeparator, this.trimTokens, true)
+				.toArray(new String[0]);
 	}
 
 	/**
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 f64d97d02..2e849b5e3 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
@@ -2,7 +2,6 @@ package cn.hutool.core.text;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.comparator.VersionComparator;
-import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.func.SerFunction;
 import cn.hutool.core.math.NumberUtil;
@@ -1012,19 +1011,7 @@ public class CharSequenceUtil extends StrChecker {
 		if (null == str || ArrayUtil.isEmpty(chars)) {
 			return str(str);
 		}
-		final int len = str.length();
-		if (0 == len) {
-			return str(str);
-		}
-		final StringBuilder builder = new StringBuilder(len);
-		char c;
-		for (int i = 0; i < len; i++) {
-			c = str.charAt(i);
-			if (false == ArrayUtil.contains(chars, c)) {
-				builder.append(c);
-			}
-		}
-		return builder.toString();
+		return filter(str, (c)-> false == ArrayUtil.contains(chars, c));
 	}
 
 	/**
@@ -1288,270 +1275,6 @@ public class CharSequenceUtil extends StrChecker {
 	}
 	// endregion
 
-	// region ----- split
-
-	/**
-	 * 切分字符串为long数组
-	 *
-	 * @param str       被切分的字符串
-	 * @param separator 分隔符
-	 * @return 切分后long数组
-	 * @since 4.0.6
-	 */
-	public static long[] splitToLong(final CharSequence str, final char separator) {
-		return Convert.convert(long[].class, splitTrim(str, separator));
-	}
-
-	/**
-	 * 切分字符串为long数组
-	 *
-	 * @param str       被切分的字符串
-	 * @param separator 分隔符字符串
-	 * @return 切分后long数组
-	 * @since 4.0.6
-	 */
-	public static long[] splitToLong(final CharSequence str, final CharSequence separator) {
-		return Convert.convert(long[].class, splitTrim(str, separator));
-	}
-
-	/**
-	 * 切分字符串为int数组
-	 *
-	 * @param str       被切分的字符串
-	 * @param separator 分隔符
-	 * @return 切分后long数组
-	 * @since 4.0.6
-	 */
-	public static int[] splitToInt(final CharSequence str, final char separator) {
-		return Convert.convert(int[].class, splitTrim(str, separator));
-	}
-
-	/**
-	 * 切分字符串为int数组
-	 *
-	 * @param str       被切分的字符串
-	 * @param separator 分隔符字符串
-	 * @return 切分后long数组
-	 * @since 4.0.6
-	 */
-	public static int[] splitToInt(final CharSequence str, final CharSequence separator) {
-		return Convert.convert(int[].class, splitTrim(str, separator));
-	}
-
-	/**
-	 * 切分字符串
- * a#b#c =》 [a,b,c]
- * a##b#c =》 [a,"",b,c] - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @return 切分后的集合 - */ - public static List split(final CharSequence str, final char separator) { - return split(str, separator, 0); - } - - /** - * 切分字符串,如果分隔符不存在则返回原字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符 - * @return 字符串 - * @since 5.6.7 - */ - public static String[] splitToArray(final CharSequence str, final CharSequence separator) { - if (str == null) { - return new String[]{}; - } - - return SplitUtil.splitToArray(str.toString(), str(separator), 0, false, false); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @return 切分后的数组 - */ - public static String[] splitToArray(final CharSequence str, final char separator) { - return splitToArray(str, separator, 0); - } - - /** - * 切分字符串 - * - * @param text 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数 - * @return 切分后的数组 - */ - public static String[] splitToArray(final CharSequence text, final char separator, final int limit) { - Assert.notNull(text, "Text must be not null!"); - return SplitUtil.splitToArray(text.toString(), separator, limit, false, false); - } - - /** - * 切分字符串,不去除切分后每个元素两边的空白符,不去除空白项 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @return 切分后的集合 - */ - public static List split(final CharSequence str, final char separator, final int limit) { - return split(str, separator, limit, false, false); - } - - /** - * 切分字符串,去除切分后每个元素两边的空白符,去除空白项 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @return 切分后的集合 - * @since 3.1.2 - */ - public static List splitTrim(final CharSequence str, final char separator) { - return splitTrim(str, separator, -1); - } - - /** - * 切分字符串,去除切分后每个元素两边的空白符,去除空白项 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @return 切分后的集合 - * @since 3.2.0 - */ - public static List splitTrim(final CharSequence str, final CharSequence separator) { - return splitTrim(str, separator, -1); - } - - /** - * 切分字符串,去除切分后每个元素两边的空白符,去除空白项 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @return 切分后的集合 - * @since 3.1.0 - */ - public static List splitTrim(final CharSequence str, final char separator, final int limit) { - return split(str, separator, limit, true, true); - } - - /** - * 切分字符串,去除切分后每个元素两边的空白符,去除空白项 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @return 切分后的集合 - * @since 3.2.0 - */ - public static List splitTrim(final CharSequence str, final CharSequence separator, final int limit) { - return split(str, separator, limit, true, true); - } - - /** - * 切分字符串,不限制分片数量 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List split(final CharSequence str, final char separator, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, 0, isTrim, ignoreEmpty); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List split(final CharSequence str, final char separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return SplitUtil.split(str, separator, limit, isTrim, ignoreEmpty); - } - - /** - * 切分字符串 - * - * @param 切分后元素类型 - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @param ignoreEmpty 是否忽略空串 - * @param mapping 切分后的字符串元素的转换方法 - * @return 切分后的集合,元素类型是经过 mapping 转换后的 - * @since 5.7.14 - */ - public static List split(final CharSequence str, final char separator, final int limit, final boolean ignoreEmpty, final Function mapping) { - return SplitUtil.split(str, separator, limit, ignoreEmpty, mapping); - } - - /** - * 切分字符串,如果分隔符不存在则返回原字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符 - * @return 字符串 - * @since 5.7.1 - */ - public static List split(final CharSequence str, final CharSequence separator) { - return split(str, separator, false, false); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 5.6.7 - */ - public static List split(final CharSequence str, final CharSequence separator, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, 0, isTrim, ignoreEmpty); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,-1不限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.0 - */ - public static List split(final CharSequence str, final CharSequence separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - final String separatorStr = (null == separator) ? null : separator.toString(); - return SplitUtil.split(str, separatorStr, limit, isTrim, ignoreEmpty); - } - - /** - * 根据给定长度,将给定字符串截取为多个部分 - * - * @param str 字符串 - * @param len 每一个小节的长度 - * @return 截取后的字符串数组 - * @see SplitUtil#splitByLength(CharSequence, int) - */ - public static String[] splitToArray(final CharSequence str, final int len) { - return SplitUtil.splitByLength(str, len); - } - /** * 将字符串切分为N等份 * @@ -1577,7 +1300,6 @@ public class CharSequenceUtil extends StrChecker { } return array; } - // endregion // region ----- sub @@ -2044,7 +1766,7 @@ public class CharSequenceUtil extends StrChecker { } final List result = new LinkedList<>(); - final String[] split = splitToArray(str, prefix); + final String[] split = SplitUtil.splitToArray(str, prefix); if (prefix.equals(suffix)) { // 前后缀字符相同,单独处理 for (int i = 1, length = split.length - 1; i < length; i += 2) { @@ -2112,12 +1834,7 @@ public class CharSequenceUtil extends StrChecker { if (count <= 0) { return EMPTY; } - - final char[] result = new char[count]; - for (int i = 0; i < count; i++) { - result[i] = c; - } - return new String(result); + return StrRepeater.of(count).repeat(c); } /** @@ -2131,33 +1848,15 @@ public class CharSequenceUtil extends StrChecker { if (null == str) { return null; } - if (count <= 0 || str.length() == 0) { - return EMPTY; - } - if (count == 1) { - return str.toString(); - } - - // 检查 - final int len = str.length(); - final long longSize = (long) len * (long) count; - final int size = (int) longSize; - if (size != longSize) { - throw new ArrayIndexOutOfBoundsException("Required String length is too large: " + longSize); - } - - final char[] array = new char[size]; - str.toString().getChars(0, len, array, 0); - int n; - for (n = len; n < size - n; n <<= 1) {// n <<= 1相当于n *2 - System.arraycopy(array, 0, array, n, n); - } - System.arraycopy(array, 0, array, n, size - n); - return new String(array); + return StrRepeater.of(count).repeat(str); } /** * 重复某个字符串到指定长度 + *
    + *
  • 如果指定长度非指定字符串的整数倍,截断到固定长度
  • + *
  • 如果指定长度小于字符串本身的长度,截断之
  • + *
* * @param str 被重复的字符 * @param padLen 指定长度 @@ -2171,19 +1870,7 @@ public class CharSequenceUtil extends StrChecker { if (padLen <= 0) { return EMPTY; } - final int strLen = str.length(); - if (strLen == padLen) { - return str.toString(); - } else if (strLen > padLen) { - return subPre(str, padLen); - } - - // 重复,直到达到指定长度 - final char[] padding = new char[padLen]; - for (int i = 0; i < padLen; i++) { - padding[i] = str.charAt(i % strLen); - } - return new String(padding); + return StrRepeater.of(padLen).repeatByLength(str); } /** @@ -2201,22 +1888,11 @@ public class CharSequenceUtil extends StrChecker { * @return 连接后的字符串 * @since 4.0.1 */ - public static String repeatAndJoin(final CharSequence str, int count, final CharSequence delimiter) { + public static String repeatAndJoin(final CharSequence str, final int count, final CharSequence delimiter) { if (count <= 0) { return EMPTY; } - final StringBuilder builder = new StringBuilder(str.length() * count); - builder.append(str); - count--; - - final boolean isAppendDelimiter = isNotEmpty(delimiter); - while (count-- > 0) { - if (isAppendDelimiter) { - builder.append(delimiter); - } - builder.append(str); - } - return builder.toString(); + return StrRepeater.of(count).repeatAndJoin(str, delimiter); } // endregion @@ -2368,8 +2044,8 @@ public class CharSequenceUtil extends StrChecker { * @param str2 第二个字符串 * @param ignoreCase 是否忽略大小写 * @return 子串是否相同 - * @since 3.2.1 * @see String#regionMatches(boolean, int, String, int, int) + * @since 3.2.1 */ public static boolean isSubEquals(final CharSequence str1, final int start1, final CharSequence str2, final boolean ignoreCase) { @@ -2387,8 +2063,8 @@ public class CharSequenceUtil extends StrChecker { * @param length 截取长度 * @param ignoreCase 是否忽略大小写 * @return 子串是否相同 - * @since 3.2.1 * @see String#regionMatches(boolean, int, String, int, int) + * @since 3.2.1 */ public static boolean isSubEquals(final CharSequence str1, final int start1, final CharSequence str2, final int start2, final int length, diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrEditor.java b/hutool-core/src/main/java/cn/hutool/core/text/StrEditor.java deleted file mode 100644 index d17f2e902..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrEditor.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.hutool.core.text; - -public class StrEditor { - private -} diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrRepeater.java b/hutool-core/src/main/java/cn/hutool/core/text/StrRepeater.java new file mode 100644 index 000000000..643381ec4 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrRepeater.java @@ -0,0 +1,164 @@ +package cn.hutool.core.text; + +/** + * 字符串或字符重复器
+ * 用于将给定字符串或字符赋值count次,然后拼接 + * + * @author looly + * @since 6.0.0 + */ +public class StrRepeater { + private final int countOrLength; + + /** + * 创建StrRepeater + * + * @param countOrLength 重复次数或固定长度 + * @return StrRepeater + */ + public static StrRepeater of(final int countOrLength) { + return new StrRepeater(countOrLength); + } + + /** + * 构造 + * + * @param countOrLength 重复次数或固定长度 + */ + public StrRepeater(final int countOrLength) { + this.countOrLength = countOrLength; + } + + /** + * 重复某个字符 + * + *
+	 * repeat('e', 0)  = ""
+	 * repeat('e', 3)  = "eee"
+	 * repeat('e', -2) = ""
+	 * 
+ * + * @param c 被重复的字符 + * @return 重复字符字符串 + */ + public String repeat(final char c) { + final int count = this.countOrLength; + if (count <= 0) { + return StrUtil.EMPTY; + } + + final char[] result = new char[count]; + for (int i = 0; i < count; i++) { + result[i] = c; + } + return new String(result); + } + + /** + * 重复某个字符串 + * + * @param str 被重复的字符 + * @return 重复字符字符串 + */ + public String repeat(final CharSequence str) { + if (null == str) { + return null; + } + + final int count = this.countOrLength; + if (count <= 0 || str.length() == 0) { + return StrUtil.EMPTY; + } + if (count == 1) { + return str.toString(); + } + + // 检查 + final int len = str.length(); + final long longSize = (long) len * (long) count; + final int size = (int) longSize; + if (size != longSize) { + throw new ArrayIndexOutOfBoundsException("Required String length is too large: " + longSize); + } + + // 相比使用StringBuilder更高效 + final char[] array = new char[size]; + str.toString().getChars(0, len, array, 0); + int n; + for (n = len; n < size - n; n <<= 1) {// n <<= 1相当于n *2 + System.arraycopy(array, 0, array, n, n); + } + System.arraycopy(array, 0, array, n, size - n); + return new String(array); + } + + /** + * 重复某个字符串到指定长度 + *
    + *
  • 如果指定长度非指定字符串的整数倍,截断到固定长度
  • + *
  • 如果指定长度小于字符串本身的长度,截断之
  • + *
+ * + * @param str 被重复的字符 + * @return 重复字符字符串 + * @since 4.3.2 + */ + public String repeatByLength(final CharSequence str) { + if (null == str) { + return null; + } + + final int padLen = this.countOrLength; + if (padLen <= 0) { + return StrUtil.EMPTY; + } + final int strLen = str.length(); + if (strLen == padLen) { + return str.toString(); + } else if (strLen > padLen) { + return StrUtil.subPre(str, padLen); + } + + // 重复,直到达到指定长度 + final char[] padding = new char[padLen]; + for (int i = 0; i < padLen; i++) { + padding[i] = str.charAt(i % strLen); + } + return new String(padding); + } + + /** + * 重复某个字符串并通过分界符连接 + * + *
+	 * repeatAndJoin("?", 5, ",")   = "?,?,?,?,?"
+	 * repeatAndJoin("?", 0, ",")   = ""
+	 * repeatAndJoin("?", 5, null) = "?????"
+	 * 
+ * + * @param str 被重复的字符串 + * @param delimiter 分界符 + * @return 连接后的字符串 + * @since 4.0.1 + */ + public String repeatAndJoin(final CharSequence str, final CharSequence delimiter) { + int count = this.countOrLength; + if (count <= 0) { + return StrUtil.EMPTY; + } + if(StrUtil.isEmpty(delimiter)){ + return repeat(str); + } + + // 初始大小 = 所有重复字符串长度 + 分界符总长度 + final StringBuilder builder = new StringBuilder( + str.length() * count + delimiter.length() * (count - 1)); + builder.append(str); + count--; + + while (count-- > 0) { + builder.append(delimiter).append(str); + } + return builder.toString(); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/text/dfa/SensitiveUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/dfa/SensitiveUtil.java index ba03bb2a6..b002c8818 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/dfa/SensitiveUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/dfa/SensitiveUtil.java @@ -1,9 +1,9 @@ package cn.hutool.core.text.dfa; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.util.CharUtil; +import cn.hutool.core.text.split.SplitUtil; +import cn.hutool.core.thread.ThreadUtil; import java.util.Collection; import java.util.HashMap; @@ -18,7 +18,10 @@ import java.util.function.Predicate; */ public final class SensitiveUtil { - public static final char DEFAULT_SEPARATOR = CharUtil.COMMA; + /** + * 默认关键词分隔符 + */ + public static final String DEFAULT_SEPARATOR = StrUtil.COMMA; private static final WordTree sensitiveTree = new WordTree(); /** @@ -63,9 +66,9 @@ public final class SensitiveUtil { * @param isAsync 是否异步初始化 * @param separator 分隔符 */ - public static void init(final String sensitiveWords, final char separator, final boolean isAsync) { + public static void init(final String sensitiveWords, final String separator, final boolean isAsync) { if (StrUtil.isNotBlank(sensitiveWords)) { - init(StrUtil.split(sensitiveWords, separator), isAsync); + init(SplitUtil.split(sensitiveWords, separator), isAsync); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java index 7bc89cad4..b5e5780ff 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java @@ -1,13 +1,11 @@ package cn.hutool.core.text.split; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Assert; import cn.hutool.core.regex.PatternPool; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.text.finder.CharFinder; -import cn.hutool.core.text.finder.CharMatcherFinder; -import cn.hutool.core.text.finder.LengthFinder; -import cn.hutool.core.text.finder.PatternFinder; -import cn.hutool.core.text.finder.StrFinder; +import cn.hutool.core.text.finder.*; import cn.hutool.core.util.CharUtil; import java.util.ArrayList; @@ -17,205 +15,74 @@ import java.util.regex.Pattern; /** * 字符串切分器,封装统一的字符串分割静态方法 + * * @author Looly * @since 5.7.0 */ public class SplitUtil { - //---------------------------------------------------------------------------------------------- Split by char + /** + * 无限制切分个数 + */ + public static int UNLIMITED = -1; + + // region ----- split to /** - * 切分字符串路径,仅支持Unix分界符:/ - *

去除每个元素两边空格,大小写敏感,忽略空串

+ * 切分字符串,去除切分后每个元素两边的空白符,去除空白项,并转为结果类型 * - * @param str 被切分的字符串 + * @param 结果类型 + * @param str 被切分的字符串 + * @param separator 分隔符字符 + * @param resultType 结果类型的类,可以是数组或集合 + * @return long数组 + */ + public static T splitTo(final CharSequence str, final CharSequence separator, final Class resultType) { + return Convert.convert(resultType, splitTrim(str, separator)); + } + // endregion + + // region ----- Split by String or char + + /** + * 切分字符串,去除切分后每个元素两边的空白符,去除空白项 + * + * @param str 被切分的字符串 + * @param separator 分隔符字符 * @return 切分后的集合 - * @since 3.0.8 + * @since 3.2.0 */ - public static List splitPath(final CharSequence str) { - return splitPath(str, 0); + public static List splitTrim(final CharSequence str, final CharSequence separator) { + return split(str, separator, true, true); } /** - * 切分字符串路径,仅支持Unix分界符:/ - *

去除每个元素两边空格,大小写敏感,忽略空串

+ * 切分字符串,如果分隔符不存在则返回原字符串
+ * 此方法不会去除切分字符串后每个元素两边的空格,不忽略空串 * - * @param str 被切分的字符串 - * @return 切分后的集合 - * @since 3.0.8 + * @param str 被切分的字符串 + * @param separator 分隔符 + * @return 字符串 */ - public static String[] splitPathToArray(final CharSequence str) { - return toArray(splitPath(str)); - } - - /** - * 切分字符串路径,仅支持Unix分界符:/ - *

去除每个元素两边空格,大小写敏感,忽略空串

- * - * @param str 被切分的字符串 - * @param limit 限制分片数,小于等于0表示无限制 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List splitPath(final CharSequence str, final int limit) { - return split(str, CharUtil.SLASH, limit, true, true); - } - - /** - * 切分字符串路径,仅支持Unix分界符:/ - *

去除每个元素两边空格,大小写敏感,忽略空串

- * - * @param str 被切分的字符串 - * @param limit 限制分片数,小于等于0表示无限制 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static String[] splitPathToArray(final CharSequence str, final int limit) { - return toArray(splitPath(str, limit)); - } - - /** - * 切分字符串,大小写敏感,去除每个元素两边空白符 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitTrim(final CharSequence str, final char separator, final boolean ignoreEmpty) { - return split(str, separator, 0, true, ignoreEmpty); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List split(final CharSequence str, final char separator, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, 0, isTrim, ignoreEmpty); - } - - /** - * 切分字符串,大小写敏感,去除每个元素两边空白符 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List splitTrim(final CharSequence str, final char separator, final int limit, final boolean ignoreEmpty) { - return split(str, separator, limit, true, ignoreEmpty, false); - } - - /** - * 切分字符串,大小写敏感 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 - */ - public static List split(final CharSequence str, final char separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, limit, isTrim, ignoreEmpty, false); - } - - /** - * 切分字符串,大小写敏感 - * - * @param 切分后的元素类型 - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param ignoreEmpty 是否忽略空串 - * @param mapping 切分后的字符串元素的转换方法 - * @return 切分后的集合,元素类型是经过 mapping 转换后的 - * @since 5.7.14 - */ - public static List split(final CharSequence str, final char separator, final int limit, final boolean ignoreEmpty, final Function mapping) { - return split(str, separator, limit, ignoreEmpty, false, mapping); - } - - /** - * 切分字符串,忽略大小写 - * - * @param text 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitIgnoreCase(final CharSequence text, final char separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return split(text, separator, limit, isTrim, ignoreEmpty, true); - } - - /** - * 切分字符串 - * - * @param text 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @param ignoreCase 是否忽略大小写 - * @return 切分后的集合 - */ - public static List split(final CharSequence text, final char separator, final int limit, final boolean isTrim, final boolean ignoreEmpty, final boolean ignoreCase) { - return split(text, separator, limit, ignoreEmpty, ignoreCase, trimFunc(isTrim)); - } - - /** - * 切分字符串
- * 如果为空字符串或者null 则返回空集合 - * - * @param 切分后的元素类型 - * @param text 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param ignoreEmpty 是否忽略空串 - * @param ignoreCase 是否忽略大小写 - * @param mapping 切分后的字符串元素的转换方法 - * @return 切分后的集合,元素类型是经过 mapping 转换后的 - * @since 5.7.14 - */ - public static List split(final CharSequence text, final char separator, final int limit, final boolean ignoreEmpty, - final boolean ignoreCase, final Function mapping) { - if (StrUtil.isEmpty(text)) { - return new ArrayList<>(0); + public static String[] splitToArray(final CharSequence str, final CharSequence separator) { + if (str == null) { + return new String[]{}; } - final SplitIter splitIter = new SplitIter(text, new CharFinder(separator, ignoreCase), limit, ignoreEmpty); - return splitIter.toList(mapping); + return toArray(split(str, separator)); } /** - * 切分字符串为字符串数组 + * 切分字符串,如果分隔符不存在则返回原字符串
+ * 此方法不会去除切分字符串后每个元素两边的空格,不忽略空串 * - * @param str 被切分的字符串 - * @param separator 分隔符字符 - * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.0.8 + * @param str 被切分的字符串 + * @param separator 分隔符 + * @return 字符串 */ - public static String[] splitToArray(final CharSequence str, final char separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return toArray(split(str, separator, limit, isTrim, ignoreEmpty)); + public static List split(final CharSequence str, final CharSequence separator) { + return split(str, separator, false, false); } - //---------------------------------------------------------------------------------------------- Split by String - /** * 切分字符串,不忽略大小写 * @@ -226,21 +93,9 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static List split(final CharSequence str, final String separator, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, -1, isTrim, ignoreEmpty, false); - } - - /** - * 切分字符串,去除每个元素两边空格,不忽略大小写 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符串 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitTrim(final CharSequence str, final String separator, final boolean ignoreEmpty) { - return split(str, separator, true, ignoreEmpty); + public static List split(final CharSequence str, final CharSequence separator, + final boolean isTrim, final boolean ignoreEmpty) { + return split(str, separator, UNLIMITED, isTrim, ignoreEmpty, false); } /** @@ -254,109 +109,127 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static List split(final CharSequence str, final String separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { + public static List split(final CharSequence str, final CharSequence separator, + final int limit, final boolean isTrim, final boolean ignoreEmpty) { return split(str, separator, limit, isTrim, ignoreEmpty, false); } - /** - * 切分字符串,去除每个元素两边空格,不忽略大小写 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符串 - * @param limit 限制分片数,小于等于0表示无限制 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitTrim(final CharSequence str, final String separator, final int limit, final boolean ignoreEmpty) { - return split(str, separator, limit, true, ignoreEmpty); - } - - /** - * 切分字符串,忽略大小写 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符串 - * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitIgnoreCase(final CharSequence str, final String separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return split(str, separator, limit, isTrim, ignoreEmpty, true); - } - - /** - * 切分字符串,去除每个元素两边空格,忽略大小写 - * - * @param str 被切分的字符串 - * @param separator 分隔符字符串 - * @param limit 限制分片数,小于等于0表示无限制 - * @param ignoreEmpty 是否忽略空串 - * @return 切分后的集合 - * @since 3.2.1 - */ - public static List splitTrimIgnoreCase(final CharSequence str, final String separator, final int limit, final boolean ignoreEmpty) { - return split(str, separator, limit, true, ignoreEmpty, true); - } - /** * 切分字符串
* 如果提供的字符串为{@code null},则返回一个空的{@link ArrayList}
* 如果提供的字符串为"",则当ignoreEmpty时返回空的{@link ArrayList},否则返回只有一个""元素的{@link ArrayList} * - * @param text 被切分的字符串 + * @param str 被切分的字符串 * @param separator 分隔符字符串 * @param limit 限制分片数,小于等于0表示无限制 * @param isTrim 是否去除切分字符串后每个元素两边的空格 * @param ignoreEmpty 是否忽略空串 * @param ignoreCase 是否忽略大小写 * @return 切分后的集合 - * @since 3.2.1 */ - public static List split(final CharSequence text, final String separator, final int limit, final boolean isTrim, final boolean ignoreEmpty, final boolean ignoreCase) { - if(null == text){ - return new ArrayList<>(0); - } else if (0 == text.length()) { - return ignoreEmpty ? new ArrayList<>(0) : ListUtil.of(StrUtil.EMPTY); - } - final SplitIter splitIter = new SplitIter(text, StrFinder.of(separator, ignoreCase), limit, ignoreEmpty); - return splitIter.toList(isTrim); + public static List split(final CharSequence str, final CharSequence separator, + final int limit, final boolean isTrim, final boolean ignoreEmpty, final boolean ignoreCase) { + return split(str, separator, limit, ignoreEmpty, ignoreCase, trimFunc(isTrim)); } /** - * 切分字符串为字符串数组 + * 切分字符串
+ * 如果提供的字符串为{@code null},则返回一个空的{@link ArrayList}
+ * 如果提供的字符串为"",则当ignoreEmpty时返回空的{@link ArrayList},否则返回只有一个""元素的{@link ArrayList} * + * @param 元素类型 * @param str 被切分的字符串 - * @param separator 分隔符字符 + * @param separator 分隔符字符串 * @param limit 限制分片数,小于等于0表示无限制 - * @param isTrim 是否去除切分字符串后每个元素两边的空格 * @param ignoreEmpty 是否忽略空串 + * @param ignoreCase 是否忽略大小写 + * @param mapping 切分后字段映射函数 + * @return 切分后的集合 + */ + public static List split(final CharSequence str, final CharSequence separator, + final int limit, final boolean ignoreEmpty, final boolean ignoreCase, + final Function mapping) { + if (null == str) { + return ListUtil.zero(); + } else if (0 == str.length() && ignoreEmpty) { + return ListUtil.zero(); + } + Assert.notEmpty(separator, "Separator must be not empty!"); + + // 查找分隔符的方式 + final TextFinder finder = separator.length() == 1 ? + new CharFinder(separator.charAt(0), ignoreCase) : + StrFinder.of(separator, ignoreCase); + + final SplitIter splitIter = new SplitIter(str, finder, limit, ignoreEmpty); + return splitIter.toList(mapping); + } + // endregion + + // region ----- Split by XXX + + /** + * 切分路径字符串
+ * 如果为空字符串或者null 则返回空集合

+ * 空路径会被忽略 + * + * @param str 被切分的字符串 + * @return 切分后的集合 + */ + public static List splitPath(final CharSequence str) { + return splitPath(str, UNLIMITED); + } + + /** + * 切分路径字符串
+ * 如果为空字符串或者null 则返回空集合
+ * 空路径会被忽略 + * + * @param str 被切分的字符串 + * @param limit 限制分片数,小于等于0表示无限制 * @return 切分后的集合 * @since 3.0.8 */ - public static String[] splitToArray(final CharSequence str, final String separator, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return toArray(split(str, separator, limit, isTrim, ignoreEmpty)); - } + public static List splitPath(final CharSequence str, final int limit) { + if (StrUtil.isBlank(str)) { + return ListUtil.zero(); + } - //---------------------------------------------------------------------------------------------- Split by Whitespace + final SplitIter splitIter = new SplitIter(str, + new CharMatcherFinder( + (c) -> c == CharUtil.SLASH || c == CharUtil.BACKSLASH), + // 路径中允许空格 + limit, true); + return splitIter.toList(false); + } /** * 使用空白符切分字符串
* 切分后的字符串两边不包含空白符,空串或空白符串并不做为元素之一
* 如果为空字符串或者null 则返回空集合 * - * @param text 被切分的字符串 + * @param str 被切分的字符串 + * @return 切分后的集合 + */ + public static List splitByBlank(final CharSequence str) { + return splitByBlank(str, UNLIMITED); + } + + /** + * 使用空白符切分字符串
+ * 切分后的字符串两边不包含空白符,空串或空白符串并不做为元素之一
+ * 如果为空字符串或者null 则返回空集合 + * + * @param str 被切分的字符串 * @param limit 限制分片数,小于等于0表示无限制 * @return 切分后的集合 * @since 3.0.8 */ - public static List split(final CharSequence text, final int limit) { - if (StrUtil.isBlank(text)) { - return new ArrayList<>(0); + public static List splitByBlank(final CharSequence str, final int limit) { + if (StrUtil.isBlank(str)) { + return ListUtil.zero(); } - final SplitIter splitIter = new SplitIter(text, new CharMatcherFinder(CharUtil::isBlankChar), limit, true); + final SplitIter splitIter = new SplitIter(str, new CharMatcherFinder(CharUtil::isBlankChar), limit, true); return splitIter.toList(false); } @@ -368,15 +241,14 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static String[] splitToArray(final CharSequence str, final int limit) { - return toArray(split(str, limit)); + public static String[] splitByBlankToArray(final CharSequence str, final int limit) { + return toArray(splitByBlank(str, limit)); } - //---------------------------------------------------------------------------------------------- Split by regex /** * 通过正则切分字符串 * - * @param text 字符串 + * @param str 字符串 * @param separatorRegex 分隔符正则 * @param limit 限制分片数,小于等于0表示无限制 * @param isTrim 是否去除切分字符串后每个元素两边的空格 @@ -384,16 +256,16 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static List splitByRegex(final CharSequence text, final String separatorRegex, final int limit, final boolean isTrim, final boolean ignoreEmpty) { + public static List splitByRegex(final CharSequence str, final String separatorRegex, final int limit, final boolean isTrim, final boolean ignoreEmpty) { final Pattern pattern = PatternPool.get(separatorRegex); - return split(text, pattern, limit, isTrim, ignoreEmpty); + return splitByRegex(str, pattern, limit, isTrim, ignoreEmpty); } /** * 通过正则切分字符串
* 如果为空字符串或者null 则返回空集合 * - * @param text 字符串 + * @param str 字符串 * @param separatorPattern 分隔符正则{@link Pattern} * @param limit 限制分片数,小于等于0表示无限制 * @param isTrim 是否去除切分字符串后每个元素两边的空格 @@ -401,11 +273,11 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static List split(final CharSequence text, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - if (StrUtil.isEmpty(text)) { - return new ArrayList<>(0); + public static List splitByRegex(final CharSequence str, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) { + if (StrUtil.isEmpty(str)) { + return ListUtil.zero(); } - final SplitIter splitIter = new SplitIter(text, new PatternFinder(separatorPattern), limit, ignoreEmpty); + final SplitIter splitIter = new SplitIter(str, new PatternFinder(separatorPattern), limit, ignoreEmpty); return splitIter.toList(isTrim); } @@ -420,26 +292,25 @@ public class SplitUtil { * @return 切分后的集合 * @since 3.0.8 */ - public static String[] splitToArray(final CharSequence str, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) { - return toArray(split(str, separatorPattern, limit, isTrim, ignoreEmpty)); + public static String[] splitByRegexToArray(final CharSequence str, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) { + return toArray(splitByRegex(str, separatorPattern, limit, isTrim, ignoreEmpty)); } - //---------------------------------------------------------------------------------------------- Split by length /** * 根据给定长度,将给定字符串截取为多个部分 * - * @param text 字符串 - * @param len 每一个小节的长度,必须大于0 + * @param str 字符串 + * @param len 每一个小节的长度,必须大于0 * @return 截取后的字符串数组 */ - public static String[] splitByLength(final CharSequence text, final int len) { - if (StrUtil.isEmpty(text)) { + public static String[] splitByLength(final CharSequence str, final int len) { + if (StrUtil.isEmpty(str)) { return new String[0]; } - final SplitIter splitIter = new SplitIter(text, new LengthFinder(len), -1, false); + final SplitIter splitIter = new SplitIter(str, new LengthFinder(len), -1, false); return splitIter.toArray(false); } - //---------------------------------------------------------------------------------------------------------- Private method start + // endregion /** * List转Array diff --git a/hutool-core/src/test/java/cn/hutool/core/codec/hash/SimhashTest.java b/hutool-core/src/test/java/cn/hutool/core/codec/hash/SimhashTest.java index e1369973b..0c7703c7b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/codec/hash/SimhashTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/codec/hash/SimhashTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.codec.hash; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import org.junit.Assert; import org.junit.Test; @@ -12,11 +13,11 @@ public class SimhashTest { final String text2 = "我是 一个 普通 字符串"; final Simhash simhash = new Simhash(); - final long hash = simhash.hash64(StrUtil.split(text1, ' ')); + final long hash = simhash.hash64(SplitUtil.split(text1, StrUtil.SPACE)); Assert.assertTrue(hash != 0); simhash.store(hash); - final boolean duplicate = simhash.equals(StrUtil.split(text2, ' ')); + final boolean duplicate = simhash.equals(SplitUtil.split(text2, StrUtil.SPACE)); Assert.assertTrue(duplicate); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/SplitUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/SplitUtilTest.java index 096f26bd3..5c004f1bd 100755 --- a/hutool-core/src/test/java/cn/hutool/core/text/SplitUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/SplitUtilTest.java @@ -4,6 +4,8 @@ import cn.hutool.core.text.split.SplitUtil; import org.junit.Assert; import org.junit.Test; +import java.util.List; + public class SplitUtilTest { @Test @@ -12,4 +14,52 @@ public class SplitUtilTest { Assert.assertThrows(IllegalArgumentException.class, () -> SplitUtil.splitByLength("test length 0", 0)); } + @Test + public void splitToLongTest() { + final String str = "1,2,3,4, 5"; + long[] longArray = SplitUtil.splitTo(str, ",", long[].class); + Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray); + + longArray = SplitUtil.splitTo(str, ",", long[].class); + Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray); + } + + @Test + public void splitToIntTest() { + final String str = "1,2,3,4, 5"; + int[] intArray = SplitUtil.splitTo(str, ",", int[].class); + Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray); + + intArray = SplitUtil.splitTo(str, ",", int[].class); + Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray); + } + + @Test + public void splitTest() { + final String str = "a,b ,c,d,,e"; + final List split = SplitUtil.split(str, ",", -1, true, true); + // 测试空是否被去掉 + Assert.assertEquals(5, split.size()); + // 测试去掉两边空白符是否生效 + Assert.assertEquals("b", split.get(1)); + + final String[] strings = SplitUtil.splitToArray("abc/", StrUtil.SLASH); + Assert.assertEquals(2, strings.length); + } + + @Test + public void splitEmptyTest() { + final String str = ""; + final List split = SplitUtil.split(str, ",", -1, true, true); + // 测试空是否被去掉 + Assert.assertEquals(0, split.size()); + } + + @Test + public void splitToArrayNullTest() { + final String[] strings = SplitUtil.splitToArray(null, "."); + Assert.assertNotNull(strings); + Assert.assertEquals(0, strings.length); + } + } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrRepeaterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrRepeaterTest.java new file mode 100644 index 000000000..8187727fd --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrRepeaterTest.java @@ -0,0 +1,21 @@ +package cn.hutool.core.text; + +import org.junit.Assert; +import org.junit.Test; + +public class StrRepeaterTest { + + @Test + public void repeatByLengthTest() { + // 如果指定长度非指定字符串的整数倍,截断到固定长度 + final String ab = StrRepeater.of(5).repeatByLength("ab"); + Assert.assertEquals("ababa", ab); + } + + @Test + public void repeatByLengthTest2() { + // 如果指定长度小于字符串本身的长度,截断之 + final String ab = StrRepeater.of(2).repeatByLength("abcde"); + Assert.assertEquals("ab", ab); + } +} 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 ccbc3fd4f..66015f20d 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 @@ -1,6 +1,7 @@ package cn.hutool.core.text; import cn.hutool.core.map.Dict; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.RandomUtil; import org.junit.Assert; @@ -61,31 +62,10 @@ public class StrUtilTest { Assert.assertArrayEquals(new String[]{"aaab", "bbcc", "cddd", "aadf", "dfsd", "fsdf", "0"}, cut); } - @Test - public void splitTest() { - final String str = "a,b ,c,d,,e"; - final List split = StrUtil.split(str, ',', -1, true, true); - // 测试空是否被去掉 - Assert.assertEquals(5, split.size()); - // 测试去掉两边空白符是否生效 - Assert.assertEquals("b", split.get(1)); - - final String[] strings = StrUtil.splitToArray("abc/", '/'); - Assert.assertEquals(2, strings.length); - } - - @Test - public void splitEmptyTest() { - final String str = ""; - final List split = StrUtil.split(str, ',', -1, true, true); - // 测试空是否被去掉 - Assert.assertEquals(0, split.size()); - } - @Test public void splitTest2() { final String str = "a.b."; - final List split = StrUtil.split(str, '.'); + final List split = SplitUtil.split(str, "."); Assert.assertEquals(3, split.size()); Assert.assertEquals("b", split.get(1)); Assert.assertEquals("", split.get(2)); @@ -93,32 +73,7 @@ public class StrUtilTest { @Test public void splitNullTest() { - Assert.assertEquals(0, StrUtil.split(null, '.').size()); - } - - @Test(expected = IllegalArgumentException.class) - public void splitToArrayNullTest() { - StrUtil.splitToArray(null, '.'); - } - - @Test - public void splitToLongTest() { - final String str = "1,2,3,4, 5"; - long[] longArray = StrUtil.splitToLong(str, ','); - Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray); - - longArray = StrUtil.splitToLong(str, ","); - Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray); - } - - @Test - public void splitToIntTest() { - final String str = "1,2,3,4, 5"; - int[] intArray = StrUtil.splitToInt(str, ','); - Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray); - - intArray = StrUtil.splitToInt(str, ","); - Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray); + Assert.assertEquals(0, SplitUtil.split(null, ".").size()); } @Test @@ -576,10 +531,10 @@ public class StrUtilTest { @Test public void wrapAllTest() { - String[] strings = StrUtil.wrapAll("`", "`", StrUtil.splitToArray("1,2,3,4", ',')); + String[] strings = StrUtil.wrapAll("`", "`", SplitUtil.splitToArray("1,2,3,4", ",")); Assert.assertEquals("[`1`, `2`, `3`, `4`]", StrUtil.utf8Str(strings)); - strings = StrUtil.wrapAllWithPair("`", StrUtil.splitToArray("1,2,3,4", ',')); + strings = StrUtil.wrapAllWithPair("`", SplitUtil.splitToArray("1,2,3,4", ",")); Assert.assertEquals("[`1`, `2`, `3`, `4`]", StrUtil.utf8Str(strings)); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java index 69a059374..5d7433bd9 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java @@ -1,6 +1,5 @@ package cn.hutool.core.text.split; -import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Test; @@ -16,7 +15,7 @@ public class StrSplitterTest { @Test public void splitByCharTest(){ final String str1 = "a, ,efedsfs, ddf"; - final List split = SplitUtil.split(str1, ',', 0, true, true); + final List split = SplitUtil.split(str1, ",", 0, true, true); Assert.assertEquals("ddf", split.get(2)); Assert.assertEquals(3, split.size()); @@ -33,15 +32,15 @@ public class StrSplitterTest { @Test public void splitByBlankTest(){ final String str1 = "aa bbccaa ddaaee"; - final List split = SplitUtil.split(str1, 0); + final List split = SplitUtil.splitByBlank(str1); Assert.assertEquals("ddaaee", split.get(2)); Assert.assertEquals(3, split.size()); } @Test public void splitPathTest(){ - final String str1 = "/use/local/bin"; - final List split = SplitUtil.splitPath(str1, 0); + final String str1 = "/use/local\\bin"; + final List split = SplitUtil.splitPath(str1); Assert.assertEquals("bin", split.get(2)); Assert.assertEquals(3, split.size()); } @@ -49,22 +48,25 @@ public class StrSplitterTest { @Test public void splitMappingTest() { final String str = "1.2."; - final List split = SplitUtil.split(str, '.', 0, true, true, Long::parseLong); + final List split = SplitUtil.split(str, ".", 0, true, true, Long::parseLong); Assert.assertEquals(2, split.size()); Assert.assertEquals(Long.valueOf(1L), split.get(0)); Assert.assertEquals(Long.valueOf(2L), split.get(1)); } + @SuppressWarnings("MismatchedReadAndWriteOfArray") @Test public void splitEmptyTest(){ final String str = ""; final String[] split = str.split(","); - final String[] strings = SplitUtil.splitToArray(str, ",", -1, false, false); + final String[] strings = SplitUtil.split(str, ",", -1, false, false) + .toArray(new String[0]); Assert.assertNotNull(strings); Assert.assertArrayEquals(split, strings); - final String[] strings2 = SplitUtil.splitToArray(str, ",", -1, false, true); + final String[] strings2 = SplitUtil.split(str, ",", -1, false, true) + .toArray(new String[0]); Assert.assertEquals(0, strings2.length); } @@ -72,11 +74,13 @@ public class StrSplitterTest { @Test public void splitNullTest(){ final String str = null; - final String[] strings = SplitUtil.splitToArray(str, ",", -1, false, false); + final String[] strings = SplitUtil.split(str, ",", -1, false, false) + .toArray(new String[0]); Assert.assertNotNull(strings); Assert.assertEquals(0, strings.length); - final String[] strings2 = SplitUtil.splitToArray(str, ",", -1, false, true); + final String[] strings2 = SplitUtil.split(str, ",", -1, false, true) + .toArray(new String[0]); Assert.assertNotNull(strings2); Assert.assertEquals(0, strings2.length); } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java index ce3c10784..fe3b57928 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java @@ -5,14 +5,10 @@ import cn.hutool.core.date.Month; import cn.hutool.core.date.Week; import cn.hutool.core.math.NumberUtil; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.util.CharUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.cron.CronException; import cn.hutool.cron.pattern.Part; -import cn.hutool.cron.pattern.matcher.AlwaysTrueMatcher; -import cn.hutool.cron.pattern.matcher.BoolArrayMatcher; -import cn.hutool.cron.pattern.matcher.DayOfMonthMatcher; -import cn.hutool.cron.pattern.matcher.PartMatcher; -import cn.hutool.cron.pattern.matcher.YearValueMatcher; +import cn.hutool.cron.pattern.matcher.*; import java.util.ArrayList; import java.util.List; @@ -103,7 +99,7 @@ public class PartParser { private List parseArray(final String value) { final List values = new ArrayList<>(); - final List parts = StrUtil.split(value, CharUtil.COMMA); + final List parts = SplitUtil.split(value, StrUtil.COMMA); for (final String part : parts) { ListUtil.addAllIfNotContains(values, parseStep(part)); } @@ -123,7 +119,7 @@ public class PartParser { * @return List */ private List parseStep(final String value) { - final List parts = StrUtil.split(value, CharUtil.SLASH); + final List parts = SplitUtil.split(value, StrUtil.SLASH); final int size = parts.size(); final List results; @@ -187,7 +183,7 @@ public class PartParser { } //Range模式 - final List parts = StrUtil.split(value, '-'); + final List parts = SplitUtil.split(value, StrUtil.DASHED); final int size = parts.size(); if (size == 1) {// 普通值 final int v1 = parseNumber(value); diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PatternParser.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PatternParser.java index 79b14ab9e..d04110d5c 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PatternParser.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PatternParser.java @@ -1,7 +1,7 @@ package cn.hutool.cron.pattern.parser; import cn.hutool.core.lang.Assert; -import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.cron.CronException; import cn.hutool.cron.pattern.Part; import cn.hutool.cron.pattern.matcher.AlwaysTrueMatcher; @@ -47,7 +47,7 @@ public class PatternParser { * @return {@link List} */ private static List parseGroupPattern(final String groupPattern) { - final List patternList = StrUtil.splitTrim(groupPattern, '|'); + final List patternList = SplitUtil.splitTrim(groupPattern, "|"); final List patternMatchers = new ArrayList<>(patternList.size()); for (final String pattern : patternList) { patternMatchers.add(parseSingle(pattern)); diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java index 3c2da0a6b..f577bd2c3 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java @@ -426,11 +426,11 @@ public class Condition implements Cloneable, Serializable { // pr#2046@Github valuesForIn = (Collection) value; } else if (value instanceof CharSequence) { - valuesForIn = StrUtil.split((CharSequence) value, ','); + valuesForIn = SplitUtil.split((CharSequence) value, StrUtil.COMMA); } else { valuesForIn = Arrays.asList(Convert.convert(Object[].class, value)); } - conditionStrBuilder.append(StrUtil.repeatAndJoin("?", valuesForIn.size(), ",")); + conditionStrBuilder.append(StrUtil.repeatAndJoin("?", valuesForIn.size(), StrUtil.COMMA)); if (null != paramValues) { paramValues.addAll(valuesForIn); } @@ -490,13 +490,13 @@ public class Condition implements Cloneable, Serializable { } } - final List strs = StrUtil.split(valueStr, CharUtil.SPACE, 2); + final List strs = SplitUtil.split(valueStr, StrUtil.SPACE, 2, true, false); if (strs.size() < 2) { return; } // 处理常用符号和IN - final String firstPart = strs.get(0).trim().toUpperCase(); + final String firstPart = strs.get(0).toUpperCase(); if (OPERATORS.contains(firstPart)) { this.operator = firstPart; // 比较符号后跟大部分为数字,此处做转换(IN不做转换) @@ -514,7 +514,8 @@ public class Condition implements Cloneable, Serializable { // 处理BETWEEN x AND y if (OPERATOR_BETWEEN.equals(firstPart)) { - final List betweenValueStrs = SplitUtil.splitTrimIgnoreCase(strs.get(1), LogicalOperator.AND.toString(), 2, true); + final List betweenValueStrs = SplitUtil.split(strs.get(1), LogicalOperator.AND.toString(), + 2, true, true, true); if (betweenValueStrs.size() < 2) { // 必须满足a AND b格式,不满足被当作普通值 return; @@ -532,11 +533,10 @@ public class Condition implements Cloneable, Serializable { * @param value 值 * @return 去掉引号后的值 */ - private static String unwrapQuote(String value) { + private static String unwrapQuote(final String value) { if (null == value) { return null; } - value = value.trim(); int from = 0; int to = value.length(); @@ -562,8 +562,7 @@ public class Condition implements Cloneable, Serializable { * @param value 被转换的字符串值 * @return 转换后的值 */ - private static Object tryToNumber(String value) { - value = StrUtil.trim(value); + private static Object tryToNumber(final String value) { if (false == NumberUtil.isNumber(value)) { return value; } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java b/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java index 87b732857..c25302f25 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java @@ -2,8 +2,8 @@ package cn.hutool.db.sql; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharUtil; import cn.hutool.db.Entity; import java.io.Serializable; @@ -115,7 +115,11 @@ public class QuoteWrapper implements Serializable { //对于Oracle这类数据库,表名中包含用户名需要单独拆分包装 if (field.contains(StrUtil.DOT)) { - final Collection target = CollUtil.edit(StrUtil.split(field, CharUtil.DOT, 2), t -> StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote)); + final Collection target = CollUtil.edit( + // 用户名和表名不能包含空格 + SplitUtil.split(field, StrUtil.DOT, 2, true, false), + // 用户名和表名都加引号 + t -> StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote)); return CollUtil.join(target, StrUtil.DOT); } diff --git a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java index 43f64eee2..c88ea9526 100644 --- a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java @@ -2,6 +2,7 @@ package cn.hutool.db.meta; import cn.hutool.core.collection.SetUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.db.ds.DSFactory; import org.junit.Assert; import org.junit.Test; @@ -33,7 +34,7 @@ public class MetaUtilTest { @Test public void getColumnNamesTest() { final String[] names = MetaUtil.getColumnNames(ds, "user"); - Assert.assertArrayEquals(StrUtil.splitToArray("id,name,age,birthday,gender", ','), names); + Assert.assertArrayEquals(SplitUtil.splitToArray("id,name,age,birthday,gender", StrUtil.COMMA), names); } @Test diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java index 12a5e42aa..1ac72b4b6 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.text.StrUtil; @@ -430,9 +431,9 @@ public class MailUtil { final List result; if (StrUtil.contains(addresses, CharUtil.COMMA)) { - result = StrUtil.splitTrim(addresses, CharUtil.COMMA); + result = SplitUtil.splitTrim(addresses, StrUtil.COMMA); } else if (StrUtil.contains(addresses, ';')) { - result = StrUtil.splitTrim(addresses, ';'); + result = SplitUtil.splitTrim(addresses, ";"); } else { result = ListUtil.of(addresses); } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/management/JavaRuntimeInfo.java b/hutool-extra/src/main/java/cn/hutool/extra/management/JavaRuntimeInfo.java index 19a6e38ab..cf09e31ff 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/management/JavaRuntimeInfo.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/management/JavaRuntimeInfo.java @@ -1,6 +1,6 @@ package cn.hutool.extra.management; -import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.SystemUtil; import java.io.Serializable; @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 代表当前运行的JRE的信息。 */ -public class JavaRuntimeInfo implements Serializable{ +public class JavaRuntimeInfo implements Serializable { private static final long serialVersionUID = 1L; private final String JAVA_RUNTIME_NAME = SystemUtil.get("java.runtime.name", false); @@ -24,6 +24,11 @@ public class JavaRuntimeInfo implements Serializable{ private final String SUN_ARCH_DATA_MODEL = SystemUtil.get("sun.arch.data.model", false); + /** + * 获取JRE的classpath + * + * @return JRE的classpath + */ public final String getSunBoothClassPath() { return SUN_BOOT_CLASS_PATH; } @@ -45,7 +50,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.3 */ public final String getName() { @@ -60,7 +64,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.3 */ public final String getVersion() { @@ -75,7 +78,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.1 */ public final String getHomeDir() { @@ -90,7 +92,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.3 */ public final String getExtDirs() { @@ -105,7 +106,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.4 */ public final String getEndorsedDirs() { @@ -120,7 +120,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.1 */ public final String getClassPath() { @@ -135,11 +134,10 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.1 */ public final String[] getClassPathArray() { - return StrUtil.splitToArray(getClassPath(), SystemUtil.get("path.separator", false)); + return SplitUtil.splitToArray(getClassPath(), SystemUtil.get("path.separator", false)); } /** @@ -150,7 +148,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * * @since Java 1.1 */ public final String getClassVersion() { @@ -165,7 +162,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * */ public final String getLibraryPath() { return JAVA_LIBRARY_PATH; @@ -179,11 +175,9 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * - * */ public final String[] getLibraryPathArray() { - return StrUtil.splitToArray(getLibraryPath(), SystemUtil.get("path.separator", false)); + return SplitUtil.splitToArray(getLibraryPath(), SystemUtil.get("path.separator", false)); } /** @@ -194,8 +188,6 @@ public class JavaRuntimeInfo implements Serializable{ *

* * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 - * - * */ public final String getProtocolPackages() { return SystemUtil.get("java.protocol.handler.pkgs", true); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java index d2fd4a7dc..b3abdb8ac 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java @@ -2,6 +2,7 @@ package cn.hutool.extra.pinyin; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import java.util.List; @@ -49,7 +50,7 @@ public interface PinyinEngine { */ default String getFirstLetter(final String str, final String separator) { final String splitSeparator = StrUtil.isEmpty(separator) ? "#" : separator; - final List split = StrUtil.split(getPinyin(str, splitSeparator), splitSeparator); + final List split = SplitUtil.split(getPinyin(str, splitSeparator), splitSeparator); return CollUtil.join(split, separator, (s)->String.valueOf(s.length() > 0 ? s.charAt(0) : StrUtil.EMPTY)); } } diff --git a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java index f36433fdb..896e2d582 100644 --- a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java +++ b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.XmlUtil; @@ -398,7 +399,7 @@ public class SoapClient implements HeaderOperation { * @return this */ public SoapClient setMethod(final String methodName, final String namespaceURI) { - final List methodNameList = StrUtil.split(methodName, ':'); + final List methodNameList = SplitUtil.split(methodName, StrUtil.COLON); final QName qName; if (2 == methodNameList.size()) { qName = new QName(namespaceURI, methodNameList.get(1), methodNameList.get(0)); diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 5c8bb7ce2..75c3518c9 100755 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -12,6 +12,7 @@ import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.ObjUtil; @@ -210,7 +211,7 @@ public final class InternalJSONUtil { * @param predicate 属性过滤器,{@link Predicate#test(Object)}为{@code true}保留 */ public static void propertyPut(final JSONObject jsonObject, final Object key, final Object value, final Predicate> predicate) { - final String[] path = StrUtil.splitToArray(Convert.toStr(key), CharUtil.DOT); + final String[] path = SplitUtil.splitToArray(Convert.toStr(key), StrUtil.DOT); final int last = path.length - 1; JSONObject target = jsonObject; for (int i = 0; i < last; i += 1) { diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java index 5cf7f63f3..3dd257b44 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java @@ -6,7 +6,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.util.CharUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.jwt.signers.AlgorithmUtil; @@ -423,7 +423,7 @@ public class JWT implements RegisteredPayload { * @return 三部分内容 */ private static List splitToken(final String token) { - final List tokens = StrUtil.split(token, CharUtil.DOT); + final List tokens = SplitUtil.split(token, StrUtil.DOT); if (3 != tokens.size()) { throw new JWTException("The token was expected 3 parts, but got {}.", tokens.size()); } diff --git a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java index 1023bd024..68cc57dac 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java @@ -10,6 +10,7 @@ import cn.hutool.core.lang.getter.GroupedTypeGetter; import cn.hutool.core.lang.getter.TypeGetter; import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.ObjUtil; import java.io.Serializable; @@ -125,7 +126,7 @@ public abstract class AbsSetting implements TypeGetter, if (StrUtil.isBlank(value)) { return null; } - return StrUtil.splitToArray(value, delimiter); + return SplitUtil.splitToArray(value, delimiter); } /** diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java index 557907d12..e8a8169e2 100755 --- a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java @@ -7,6 +7,7 @@ import cn.hutool.core.io.resource.Resource; import cn.hutool.core.lang.Assert; import cn.hutool.core.regex.ReUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.SystemUtil; @@ -124,13 +125,14 @@ public class SettingLoader { continue; } - final String[] keyValue = StrUtil.splitToArray(line, this.assignFlag, 2); + final String[] keyValue = SplitUtil.split(line, String.valueOf(this.assignFlag), 2, true, false) + .toArray(new String[0]); // 跳过不符合键值规范的行 if (keyValue.length < 2) { continue; } - String value = keyValue[1].trim(); + String value = keyValue[1]; // 替换值中的所有变量变量(变量必须是此行之前定义的变量,否则无法找到) if (this.isUseVariable) { value = replaceVar(group, value); @@ -224,7 +226,7 @@ public class SettingLoader { String varValue = this.groupedMap.get(group, key); // 跨分组查找 if (null == varValue) { - final List groupAndKey = StrUtil.split(key, CharUtil.DOT, 2); + final List groupAndKey = SplitUtil.split(key, StrUtil.DOT, 2, true, false); if (groupAndKey.size() > 1) { varValue = this.groupedMap.get(groupAndKey.get(0), groupAndKey.get(1)); } diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/color/ColorUtil.java b/hutool-swing/src/main/java/cn/hutool/swing/img/color/ColorUtil.java index 5a1dffab4..6dd19481c 100644 --- a/hutool-swing/src/main/java/cn/hutool/swing/img/color/ColorUtil.java +++ b/hutool-swing/src/main/java/cn/hutool/swing/img/color/ColorUtil.java @@ -6,6 +6,8 @@ import cn.hutool.core.lang.ansi.Ansi8BitColor; import cn.hutool.core.lang.ansi.AnsiElement; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.text.split.SplitUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import java.awt.Color; @@ -23,6 +25,7 @@ import java.util.Random; public class ColorUtil { private static final Map COLOR_MAPPING; + static { final Map colorMap = MapUtil .builder("BLACK", Color.BLACK) @@ -57,10 +60,11 @@ public class ColorUtil { /** * 将颜色转换为CSS的rgba表示形式,输出结果格式为:rgba(red, green, blue) + * * @param color AWT颜色 * @return rgb(red, green, blue) */ - public static String toCssRgb(final Color color){ + public static String toCssRgb(final Color color) { return StrUtil.builder() .append("rgb(") .append(color.getRed()).append(",") @@ -71,10 +75,11 @@ public class ColorUtil { /** * 将颜色转换为CSS的rgba表示形式,输出结果格式为:rgba(red, green, blue, alpha) + * * @param color AWT颜色 * @return rgba(red, green, blue, alpha) */ - public static String toCssRgba(final Color color){ + public static String toCssRgba(final Color color) { return StrUtil.builder() .append("rgba(") .append(color.getRed()).append(",") @@ -135,7 +140,7 @@ public class ColorUtil { // 预定义颜色别名 final Color color = COLOR_MAPPING.get(colorName); - if(null != color){ + if (null != color) { return color; } @@ -148,19 +153,19 @@ public class ColorUtil { } // RGB值和RGBA - final List rgb = StrUtil.split(colorName, ','); + final List rgb = SplitUtil.split(colorName, StrUtil.COMMA); final int size = rgb.size(); - if(3 == size){ + if (3 == size) { // RGB final Integer[] rgbIntegers = Convert.toIntArray(rgb); return new Color(rgbIntegers[0], rgbIntegers[1], rgbIntegers[2]); } - if(4 == size){ + if (4 == size) { // RGBA final Float[] rgbFloats = Convert.toFloatArray(rgb); Float a = rgbFloats[3]; - if(a < 1){ + if (a < 1) { // 识别CSS形式 a *= 255; } @@ -243,7 +248,7 @@ public class ColorUtil { /** * AWT的{@link Color}颜色转换为ANSI颜色,由于取最接近颜色,故可能有色差 * - * @param rgb RGB颜色 + * @param rgb RGB颜色 * @param is8Bit 是否8bit的ANSI颜色 * @param isBackground 是否背景色 * @return ANSI颜色 @@ -313,7 +318,7 @@ public class ColorUtil { maxCount = count; } } - final String[] splitRgbStr = StrUtil.splitToArray(maxColor, '-'); + final String[] splitRgbStr = SplitUtil.splitToArray(maxColor, StrUtil.DASHED); String rHex = Integer.toHexString(Integer.parseInt(splitRgbStr[0])); String gHex = Integer.toHexString(Integer.parseInt(splitRgbStr[1])); String bHex = Integer.toHexString(Integer.parseInt(splitRgbStr[2])); @@ -333,7 +338,7 @@ public class ColorUtil { * @return 是否匹配 */ private static boolean matchFilters(final int r, final int g, final int b, final int[]... rgbFilters) { - if (rgbFilters != null && rgbFilters.length > 0) { + if (ArrayUtil.isNotEmpty(rgbFilters)) { for (final int[] rgbFilter : rgbFilters) { if (r == rgbFilter[0] && g == rgbFilter[1] && b == rgbFilter[2]) { return true;