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

如何理解Kotlin中的空值?代码等价性与正确性技术咨询

Kotlin代码等价性及修正分析

我在研究一段openai-kotlin项目中的代码,对其中的it.choices.first().delta?.content.orEmpty()逻辑有点懵,想确认它是不是和Code B等价,另外我觉得原Code A可能有问题,是不是该改成Code C?

Code A

openAI.chatCompletions(chatCompletionRequest)
        .onEach { print(it.choices.first().delta?.content.orEmpty()) }
        .onCompletion { println() }
        .launchIn(scope)
        .join()

Code B

if (it.choices.first().delta != null) {
   it.choices.first().delta.content
}else{
   orEmpty()
}

Code C

openAI.chatCompletions(chatCompletionRequest)
        .onEach { print(it.choices.first().delta?.content?.orEmpty()) } //I add a ? after content
        .onCompletion { println() }
        .launchIn(scope)
        .join()

一、Code A和Code B不等价

首先Code B本身就有语法问题:else分支里直接写orEmpty()根本跑不起来,orEmpty()得依附在某个对象或者可空类型上调用,单独写是编译错误。

再看逻辑:Code A里的delta?.content.orEmpty()是Kotlin安全调用加扩展函数的组合,实际逻辑是:如果delta不为null且delta.content也不为null,就用delta.content;要是delta本身是null,或者delta存在但content是null,就返回空字符串。

而Code B只判断了delta是不是null,完全没考虑delta存在但content为空的情况,逻辑上就缺一块,更别说语法错误了,所以两者肯定不等价。

二、Code A不需要改成Code C

Kotlin里有专门针对可空CharSequence?的orEmpty()扩展函数,delta?.content的类型是String?(属于CharSequence?),直接调用orEmpty()完全合法,会自动处理content为null的情况。你在Code C里加的那个?.是多余的——delta?.content已经是可空类型,直接调用orEmpty()就能达到预期效果,加不加?.逻辑都一样,反而显得没必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:30