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

Kotlin String.split().filterIndexed()返回size为1的空列表问题

现象根因

两个看似相同的空列表长度不一致,是两点逻辑叠加导致的:

  • Kotlin 中String.split对空字符串的默认返回规则不符合直觉预期
  • 仅包含单个空字符串元素的列表,控制台打印效果和真正的空列表完全一致,造成视觉误判

执行流程拆解

  1. 对空字符串""调用split("-", ",")时,不会返回空列表:split的切分逻辑是,无论原字符串内容是什么,只要没有匹配到任何分隔符,就会把原字符串本身作为唯一的切分结果返回。所以这一步的实际返回值是listOf(""),长度为1,唯一元素是空字符串。
  2. 后续执行filterIndexed { index, _ -> index % 2 ==0 }时,上述唯一元素的索引为0,满足筛选条件被保留,最终delPositions的实际值是mutableListOf(""),长度为1。
  3. 打印该列表时,由于唯一元素是空串,List.toString()的拼接结果为[],和真正空列表的打印输出完全相同,肉眼无法区分,才会让人误以为这是长度为0的空列表。
  4. 而delDetailEmpty.toList()的逻辑是将字符串逐字符拆分为字符列表,空字符串不存在任何字符,返回的是真正的空列表emptyList<Char>(),长度为0。

验证方式

通过以下代码可以确认列表的实际存储内容,避免被打印效果误导:

println(delPositions.isEmpty()) // 返回false,证明列表并非空
println(delPositions.first() == "") // 返回true,证明列表内存储了一个空字符串元素

修正方案

如果希望空字符串经过split处理后返回真正的空列表,只需要在切分后增加过滤空片段的步骤即可:

val delPositions = delDetailEmpty.split("-",",")
    .filter { it.isNotEmpty() } // 移除切分产生的空片段
    .filterIndexed { index, _ -> index % 2 ==0 }
    .toMutableList()

修正后,空字符串输入场景下delPositions会是真正的空列表,长度为0,符合预期。

内容的提问来源于stack exchange,提问作者Swaminath Bera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:24:20