You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:54:26