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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:16:05