Kotlin中String.split处理空字符串的行为及预期分割方案
问题根因
Kotlin 标准库CharSequence.split的默认逻辑是:如果原字符串中没有匹配到指定分隔符,就返回仅包含原字符串本身的单元素列表。空字符串""里不存在空格分隔符,因此"".split(" ")的返回值是[""],和预期的空列表不一致,直接导致最后一条断言失败。
解决方案
实现一个轻量扩展函数处理空字符串边界即可,非空场景下完全复用原有split的逻辑,不会破坏前三个非空子列表的测试结果:
fun String.splitMatchJoinExpect(delimiter: String): List<String> = if (isEmpty()) emptyList() else split(delimiter)
把测试代码中所有split调用替换为这个扩展方法,四个断言就能全部通过:
@Test fun test() { val list = listOf("one", "two", "three") assertEquals(list.subList(0, 3), list.subList(0, 3).joinToString(" ").splitMatchJoinExpect(" ")) assertEquals(list.subList(0, 2), list.subList(0, 2).joinToString(" ").splitMatchJoinExpect(" ")) assertEquals(list.subList(0, 1), list.subList(0, 1).joinToString(" ").splitMatchJoinExpect(" ")) assertEquals(list.subList(0, 0), list.subList(0, 0).joinToString(" ").splitMatchJoinExpect(" ")) }
避坑说明
- 不要直接在split结果后追加
.filter { it.isNotEmpty() }:如果原列表本身包含空字符串元素,join后会生成连续分隔符,这种过滤会错误删除原列表里的合法空串,破坏非空场景的结果一致性。 - 不需要改用正则版本的split:正则split对空字符串的默认处理和普通split完全一致,仍然会返回带空串的单元素列表,额外加边界判断的成本和自定义扩展没有区别,没有替换价值。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

