Kotlin中for循环遍历数组仅返回首个值无法返回多值的问题
出错原因
你的代码存在3个核心问题,导致只能拿到第一个值:
- 返回值类型定义错误:函数声明的返回类型是
String?,属于单值类型,本身就不支持返回多个结果,和你要获取多个name的需求不匹配。 - 循环遍历对象构造错误:
val entrySize = arrayOf(batches.entries!!)这行代码是把整个entries列表作为唯一元素存入了新数组,导致这个新数组的长度永远是1,循环只会执行1次,根本没有遍历到entries里的每一个TruckEntry元素。 - 循环内return逻辑错误:for循环第一次执行时就触发了
return语句,Kotlin中return会直接终止整个函数的执行,哪怕后面还有待遍历的元素,也不会继续运行循环逻辑。
修改方案
首先根据业务需求调整返回值逻辑:如果需要获取多个name,要么把返回值改为字符串列表存储所有name,要么把多个name按规则拼接为单个字符串返回,以下是两种常见场景的实现:
场景1:返回所有name组成的列表
// 修改返回值类型为字符串列表,适配多值返回需求 private fun getBatchNames(batches: Batches): List<String?> { // 前置判空,entries为空时直接返回空列表,避免冗余的非空断言 val entryList = batches.entries ?: return emptyList() return entryList.map { it.name } }
场景2:拼接所有name为单个字符串返回
如果业务要求返回单个字符串,可以把所有name用分隔符拼接,entries为空时返回原有占位符:
private fun getBatchName(batches: Batches): String { val entryList = batches.entries if (entryList.isNullOrEmpty()) { return "****************" } // 过滤掉name为null的条目,用顿号拼接所有有效名称 return entryList.mapNotNull { it.name }.joinToString(separator = "、") }
补充说明:不要在已经做过空判断的位置滥用
!!非空断言,容易引发空指针崩溃,Kotlin提供了空安全调用、?:空合并操作符可以更安全地处理可空类型。
内容的提问来源于stack exchange,提问作者Francis Gacheru
相关产品推荐
相关产品推荐

