Kotlin String.split().filterIndexed()返回size为1的空列表问题
现象根因
两个看似相同的空列表长度不一致,是两点逻辑叠加导致的:
- Kotlin 中
String.split对空字符串的默认返回规则不符合直觉预期 - 仅包含单个空字符串元素的列表,控制台打印效果和真正的空列表完全一致,造成视觉误判
执行流程拆解
- 对空字符串
""调用split("-", ",")时,不会返回空列表:split的切分逻辑是,无论原字符串内容是什么,只要没有匹配到任何分隔符,就会把原字符串本身作为唯一的切分结果返回。所以这一步的实际返回值是listOf(""),长度为1,唯一元素是空字符串。 - 后续执行
filterIndexed { index, _ -> index % 2 ==0 }时,上述唯一元素的索引为0,满足筛选条件被保留,最终delPositions的实际值是mutableListOf(""),长度为1。 - 打印该列表时,由于唯一元素是空串,
List.toString()的拼接结果为[],和真正空列表的打印输出完全相同,肉眼无法区分,才会让人误以为这是长度为0的空列表。 - 而
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
相关产品推荐
相关产品推荐

