fix split null bug

This commit is contained in:
looly 2022-01-06 07:39:46 +08:00
parent 0ef4be6b0e
commit da0d737cd0
5 changed files with 34 additions and 30 deletions

View File

@ -3,7 +3,7 @@
-------------------------------------------------------------------------------------------------------------
# 5.7.19 (2022-01-05)
# 5.7.19 (2022-01-06)
### 🐣新特性
* 【db 】 优化Condition参数拆分pr#2046@Github
@ -22,6 +22,7 @@
* 【http 】 修复HttpRequest.of无法自动添加http前缀问题issue#I4PEYL@Gitee
* 【core 】 修复 `CharSequenceUtil.brief(str, maxLength)` 方法字符串越界问题,以及 `maxLength` 部分值时结果与预期不符的问题pr#2068@Github
* 【core 】 修复NamingCase中转换下划线字母+数字转换问题issue#2070@Github
* 【core 】 修复split空判断不一致问题pr#496@Gitee
-------------------------------------------------------------------------------------------------------------
# 5.7.18 (2021-12-25)

View File

@ -22,7 +22,6 @@ import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.MessageFormat;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@ -1803,10 +1802,7 @@ public class CharSequenceUtil {
* @since 5.7.14
*/
public static <R> List<R> split(CharSequence str, char separator, int limit, boolean ignoreEmpty, Function<String, R> mapping) {
if (null == str) {
return new ArrayList<>(0);
}
return StrSplitter.split(str.toString(), separator, limit, ignoreEmpty, mapping);
return StrSplitter.split(str, separator, limit, ignoreEmpty, mapping);
}
/**
@ -1847,11 +1843,8 @@ public class CharSequenceUtil {
* @since 3.2.0
*/
public static List<String> split(CharSequence str, CharSequence separator, int limit, boolean isTrim, boolean ignoreEmpty) {
if (null == str) {
return new ArrayList<>(0);
}
final String separatorStr = (null == separator) ? null : separator.toString();
return StrSplitter.split(str.toString(), separatorStr, limit, isTrim, ignoreEmpty);
return StrSplitter.split(str, separatorStr, limit, isTrim, ignoreEmpty);
}
/**
@ -1860,13 +1853,10 @@ public class CharSequenceUtil {
* @param str 字符串
* @param len 每一个小节的长度
* @return 截取后的字符串数组
* @see StrSplitter#splitByLength(String, int)
* @see StrSplitter#splitByLength(CharSequence, int)
*/
public static String[] split(CharSequence str, int len) {
if (null == str) {
return new String[]{};
}
return StrSplitter.splitByLength(str.toString(), len);
return StrSplitter.splitByLength(str, len);
}
/**

View File

@ -1,6 +1,5 @@
package cn.hutool.core.text;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.PatternPool;
import cn.hutool.core.text.finder.CharFinder;
import cn.hutool.core.text.finder.CharMatcherFinder;
@ -12,14 +11,12 @@ import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Pattern;
/**
* 字符串切分器封装统一的字符串分割静态方法
*
* @author Looly
* @since 5.7.0
*/
@ -176,7 +173,7 @@ public class StrSplitter {
}
/**
* 切分字符串
* 切分字符串<br>
* 如果为空字符串或者null 则返回空集合
*
* @param <R> 切分后的元素类型
@ -191,8 +188,8 @@ public class StrSplitter {
*/
public static <R> List<R> split(CharSequence text, char separator, int limit, boolean ignoreEmpty,
boolean ignoreCase, Function<String, R> mapping) {
if (StrUtil.isBlank(text)) {
return Collections.emptyList();
if (null == text) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new CharFinder(separator, ignoreCase), limit, ignoreEmpty);
return splitIter.toList(mapping);
@ -301,7 +298,8 @@ public class StrSplitter {
}
/**
* 切分字符串
* 切分字符串<br>
* 如果为空字符串或者null 则返回空集合
*
* @param text 被切分的字符串
* @param separator 分隔符字符串
@ -313,6 +311,9 @@ public class StrSplitter {
* @since 3.2.1
*/
public static List<String> split(CharSequence text, String separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase) {
if (null == text) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new StrFinder(separator, ignoreCase), limit, ignoreEmpty);
return splitIter.toList(isTrim);
}
@ -336,7 +337,8 @@ public class StrSplitter {
/**
* 使用空白符切分字符串<br>
* 切分后的字符串两边不包含空白符空串或空白符串并不做为元素之一
* 切分后的字符串两边不包含空白符空串或空白符串并不做为元素之一<br>
* 如果为空字符串或者null 则返回空集合
*
* @param text 被切分的字符串
* @param limit 限制分片数
@ -344,8 +346,7 @@ public class StrSplitter {
* @since 3.0.8
*/
public static List<String> split(CharSequence text, int limit) {
if (StrUtil.isEmpty(text)) {
if (null == text) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new CharMatcherFinder(CharUtil::isBlankChar), limit, true);
@ -382,7 +383,8 @@ public class StrSplitter {
}
/**
* 通过正则切分字符串
* 通过正则切分字符串<br>
* 如果为空字符串或者null 则返回空集合
*
* @param text 字符串
* @param separatorPattern 分隔符正则{@link Pattern}
@ -393,8 +395,7 @@ public class StrSplitter {
* @since 3.0.8
*/
public static List<String> split(String text, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty) {
Assert.notNull(text, "Text must be not null!");
if (text.length() < 1) {
if (null == text) {
return new ArrayList<>(0);
}
final SplitIter splitIter = new SplitIter(text, new PatternFinder(separatorPattern), limit, ignoreEmpty);
@ -424,7 +425,10 @@ public class StrSplitter {
* @param len 每一个小节的长度
* @return 截取后的字符串数组
*/
public static String[] splitByLength(String text, int len) {
public static String[] splitByLength(CharSequence text, int len) {
if (null == text) {
return new String[0];
}
SplitIter splitIter = new SplitIter(text, new LengthFinder(len), -1, false);
return splitIter.toArray(false);
}

View File

@ -38,7 +38,7 @@ public class SplitIter extends ComputeIter<String> implements Serializable {
/**
* 构造
*
* @param text 文本
* @param text 文本不能为{@code null}
* @param separatorFinder 分隔符匹配器
* @param limit 限制数量小于等于0表示无限制
* @param ignoreEmpty 是否忽略""

View File

@ -60,6 +60,15 @@ public class StrSpliterTest {
String str = "";
final String[] split = str.split(",");
final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false);
Assert.assertNotNull(strings);
Assert.assertArrayEquals(split, strings);
}
@Test
public void splitNullTest(){
String str = null;
final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false);
Assert.assertNotNull(strings);
Assert.assertEquals(0, strings.length);
}
}