为何Kotlin中含forEach的Log语句返回kotlin.Unit而非预期结果?
问题解释:forEach返回kotlin.Unit的原因
问题场景
在以下Kotlin代码中,B0日志能输出正确的集合元素信息,但B1日志却输出kotlin.Unit:
Kotlin代码
val offerToken = offers?.let { Log.d(TAG,"B0: Offers: Size:"+ it.size +" My: "+ it[0].offerTags.toString() ) Log.d(TAG,"B1: Offers: Size:"+ it.size +" "+ it.forEach{a -> "My Office: "+ a.offerTags.toString()} ) leastPricedOfferToken(it) }
运行结果
B0: Offers: Size:1 My: [yearlypremium] B1: Offers: Size:1 kotlin.Unit
原因分析
forEach是Kotlin中专门用于遍历执行逻辑的函数,它本身没有实际返回值(严格来说返回Unit,代表无意义的空返回)。你把forEach的调用结果直接拼接到日志字符串里,自然就会显示它的返回值kotlin.Unit——Lambda里的"My Office: "+ a.offerTags.toString()只是在遍历过程中执行,但不会被收集或返回。- 而B0是通过索引直接获取集合元素
it[0],调用toString()得到的是该元素offerTags的实际字符串内容,所以能正常输出预期结果。
修正方案
如果想要遍历集合并把所有元素的信息拼接成字符串输出,应该用joinToString函数——它会遍历每个元素,收集Lambda返回的字符串,最后拼接成一个整体:
val offerToken = offers?.let { Log.d(TAG,"B0: Offers: Size:"+ it.size +" My: "+ it[0].offerTags.toString() ) // 用joinToString替代forEach Log.d(TAG,"B1: Offers: Size:"+ it.size +" "+ it.joinToString { "My Office: ${it.offerTags}" }) leastPricedOfferToken(it) }
修正后运行结果会变成:
B0: Offers: Size:1 My: [yearlypremium] B1: Offers: Size:1 My Office: [yearlypremium]
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

