如何理解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
相关产品推荐
相关产品推荐

