!954 优化SplitUtil

Merge pull request !954 from emptypoint/update-SplitUtil
This commit is contained in:
Looly 2023-03-13 03:17:29 +00:00 committed by Gitee
commit 0df74202c2
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
5 changed files with 44 additions and 38 deletions

View File

@ -1,7 +1,7 @@
package cn.hutool.core.text.finder;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.math.NumberUtil;
import cn.hutool.core.util.CharUtil;
/**
* 字符查找器<br>
@ -42,13 +42,13 @@ public class CharFinder extends TextFinder {
final int limit = getValidEndIndex();
if(negative){
for (int i = from; i > limit; i--) {
if (NumberUtil.equals(c, text.charAt(i), caseInsensitive)) {
if (CharUtil.equals(c, text.charAt(i), caseInsensitive)) {
return i;
}
}
} else{
for (int i = from; i < limit; i++) {
if (NumberUtil.equals(c, text.charAt(i), caseInsensitive)) {
if (CharUtil.equals(c, text.charAt(i), caseInsensitive)) {
return i;
}
}

View File

@ -16,7 +16,7 @@ public class LengthFinder extends TextFinder {
/**
* 构造
* @param length 长度
* @param length 长度必须大于0
*/
public LengthFinder(final int length) {
Assert.isTrue(length > 0, "Length must be great than 0");

View File

@ -1,5 +1,7 @@
package cn.hutool.core.text.finder;
import cn.hutool.core.regex.PatternPool;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -23,7 +25,7 @@ public class PatternFinder extends TextFinder {
* @param caseInsensitive 是否忽略大小写
*/
public PatternFinder(final String regex, final boolean caseInsensitive) {
this(Pattern.compile(regex, caseInsensitive ? Pattern.CASE_INSENSITIVE : 0));
this(PatternPool.get(regex, caseInsensitive ? Pattern.CASE_INSENSITIVE : 0));
}
/**

View File

@ -125,7 +125,7 @@ public class SplitIter extends ComputeIter<String> implements Serializable {
* @return 切分后的列表
*/
public List<String> toList(final boolean trim) {
return toList((str) -> trim ? StrUtil.trim(str) : str);
return toList(trim ? StrUtil::trim : Function.identity());
}
/**

View File

@ -25,6 +25,7 @@ public class SplitUtil {
/**
* 切分字符串路径仅支持Unix分界符/
* <p>去除每个元素两边空格大小写敏感忽略空串</p>
*
* @param str 被切分的字符串
* @return 切分后的集合
@ -36,6 +37,7 @@ public class SplitUtil {
/**
* 切分字符串路径仅支持Unix分界符/
* <p>去除每个元素两边空格大小写敏感忽略空串</p>
*
* @param str 被切分的字符串
* @return 切分后的集合
@ -47,9 +49,10 @@ public class SplitUtil {
/**
* 切分字符串路径仅支持Unix分界符/
* <p>去除每个元素两边空格大小写敏感忽略空串</p>
*
* @param str 被切分的字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @return 切分后的集合
* @since 3.0.8
*/
@ -59,9 +62,10 @@ public class SplitUtil {
/**
* 切分字符串路径仅支持Unix分界符/
* <p>去除每个元素两边空格大小写敏感忽略空串</p>
*
* @param str 被切分的字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @return 切分后的集合
* @since 3.0.8
*/
@ -70,7 +74,7 @@ public class SplitUtil {
}
/**
* 切分字符串
* 切分字符串大小写敏感去除每个元素两边空白符
*
* @param str 被切分的字符串
* @param separator 分隔符字符
@ -101,7 +105,7 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.0.8
@ -115,7 +119,7 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
@ -131,7 +135,7 @@ public class SplitUtil {
* @param <R> 切分后的元素类型
* @param str 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param ignoreEmpty 是否忽略空串
* @param mapping 切分后的字符串元素的转换方法
* @return 切分后的集合元素类型是经过 mapping 转换后的
@ -146,7 +150,7 @@ public class SplitUtil {
*
* @param text 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
@ -161,7 +165,7 @@ public class SplitUtil {
*
* @param text 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @param ignoreCase 是否忽略大小写
@ -178,7 +182,7 @@ public class SplitUtil {
* @param <R> 切分后的元素类型
* @param text 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数-1不限制
* @param limit 限制分片数小于等于0表示无限制
* @param ignoreEmpty 是否忽略空串
* @param ignoreCase 是否忽略大小写
* @param mapping 切分后的字符串元素的转换方法
@ -187,7 +191,7 @@ public class SplitUtil {
*/
public static <R> List<R> split(final CharSequence text, final char separator, final int limit, final boolean ignoreEmpty,
final boolean ignoreCase, final Function<String, R> mapping) {
if (null == text) {
if (StrUtil.isEmpty(text)) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new CharFinder(separator, ignoreCase), limit, ignoreEmpty);
@ -199,7 +203,7 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separator 分隔符字符
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
@ -226,7 +230,7 @@ public class SplitUtil {
}
/**
* 切分字符串去除每个元素两边空格忽略大小写
* 切分字符串去除每个元素两边空格忽略大小写
*
* @param str 被切分的字符串
* @param separator 分隔符字符串
@ -254,11 +258,11 @@ public class SplitUtil {
}
/**
* 切分字符串去除每个元素两边空格忽略大小写
* 切分字符串去除每个元素两边空格忽略大小写
*
* @param str 被切分的字符串
* @param separator 分隔符字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.2.1
@ -272,7 +276,7 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separator 分隔符字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
@ -287,7 +291,7 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separator 分隔符字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.2.1
@ -310,7 +314,7 @@ public class SplitUtil {
* @since 3.2.1
*/
public static List<String> split(final CharSequence text, final String separator, final int limit, final boolean isTrim, final boolean ignoreEmpty, final boolean ignoreCase) {
if (null == text) {
if (StrUtil.isEmpty(text)) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new StrFinder(separator, ignoreCase), limit, ignoreEmpty);
@ -340,12 +344,12 @@ public class SplitUtil {
* 如果为空字符串或者null 则返回空集合
*
* @param text 被切分的字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @return 切分后的集合
* @since 3.0.8
*/
public static List<String> split(final CharSequence text, final int limit) {
if (null == text) {
if (StrUtil.isBlank(text)) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new CharMatcherFinder(CharUtil::isBlankChar), limit, true);
@ -356,11 +360,11 @@ public class SplitUtil {
* 切分字符串为字符串数组
*
* @param str 被切分的字符串
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @return 切分后的集合
* @since 3.0.8
*/
public static String[] splitToArray(final String str, final int limit) {
public static String[] splitToArray(final CharSequence str, final int limit) {
return toArray(split(str, limit));
}
//---------------------------------------------------------------------------------------------- Split by regex
@ -370,13 +374,13 @@ public class SplitUtil {
*
* @param text 字符串
* @param separatorRegex 分隔符正则
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.0.8
*/
public static List<String> splitByRegex(final String text, final String separatorRegex, final int limit, final boolean isTrim, final boolean ignoreEmpty) {
public static List<String> splitByRegex(final CharSequence text, 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);
}
@ -387,14 +391,14 @@ public class SplitUtil {
*
* @param text 字符串
* @param separatorPattern 分隔符正则{@link Pattern}
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.0.8
*/
public static List<String> split(final String text, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) {
if (null == text) {
public static List<String> split(final CharSequence text, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) {
if (StrUtil.isEmpty(text)) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new PatternFinder(separatorPattern), limit, ignoreEmpty);
@ -406,13 +410,13 @@ public class SplitUtil {
*
* @param str 被切分的字符串
* @param separatorPattern 分隔符正则{@link Pattern}
* @param limit 限制分片数
* @param limit 限制分片数小于等于0表示无限制
* @param isTrim 是否去除切分字符串后每个元素两边的空格
* @param ignoreEmpty 是否忽略空串
* @return 切分后的集合
* @since 3.0.8
*/
public static String[] splitToArray(final String str, final Pattern separatorPattern, final int limit, final boolean isTrim, final boolean ignoreEmpty) {
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));
}
//---------------------------------------------------------------------------------------------- Split by length
@ -421,11 +425,11 @@ public class SplitUtil {
* 根据给定长度将给定字符串截取为多个部分
*
* @param text 字符串
* @param len 每一个小节的长度
* @param len 每一个小节的长度必须大于0
* @return 截取后的字符串数组
*/
public static String[] splitByLength(final CharSequence text, final int len) {
if (null == text) {
if (StrUtil.isEmpty(text)) {
return new String[0];
}
final SplitIter splitIter = new SplitIter(text, new LengthFinder(len), -1, false);
@ -449,8 +453,8 @@ public class SplitUtil {
* @param isTrim 是否trim
* @return {@link Function}
*/
private static Function<String, String> trimFunc(final boolean isTrim) {
return (str) -> isTrim ? StrUtil.trim(str) : str;
public static Function<String, String> trimFunc(final boolean isTrim) {
return isTrim ? StrUtil::trim : Function.identity();
}
//---------------------------------------------------------------------------------------------------------- Private method end
}