Kotlin中如何仅当值非空时为变量赋值?
在Kotlin中简洁实现“仅当值非null时赋值变量”的方法
当然有啦!咱们来一步步理清这个问题,包括你提到的那个运算符的原理,以及哪种写法最贴合你的需求~
先搞懂你提到的?:运算符(Elvis运算符)
这个运算符在Kotlin里叫做Elvis运算符,作用非常明确:
- 如果左边的表达式不为
null,就返回左边的值; - 如果左边是
null,就执行右边的表达式(或者返回右边的值)。
举个简单例子:
val nullableStr: String? = "Hello" val result = nullableStr ?: "Default Value" // result的值是"Hello",因为nullableStr非null val nullStr: String? = null val anotherResult = nullStr ?: "Default Value" // anotherResult的值是"Default Value",因为nullStr是null
分析你写的y = x ?: return是否符合需求
首先纠正一下写法:应该是y = x ?: return(你多打了一个问号)。这个写法的逻辑是:
- 如果
x非null,就把x赋值给y; - 如果
x是null,就直接执行return,终止当前函数/方法。
但这和你原始需求if(x != null) y = x(仅当x非null时赋值,x为null时什么都不做)并不完全一致——因为当x为null时,这个写法会直接退出函数,而不是跳过赋值操作。如果你本来就希望x为null时终止流程,那这个写法没问题;但如果只是不想给y赋值、还要继续执行后续代码,那这个写法就不合适了。
最贴合需求的简洁写法
如果你只想在x非null时给y赋值,x为null时不做任何操作,最简洁且语义清晰的写法是用let函数配合安全调用符?.:
x?.let { y = it }
- 当
x非null时,?.会触发let块,把x作为参数it传入,执行y = it完成赋值; - 当
x为null时,?.会直接跳过let块,y保持原来的值,完全对应你原始的if(x != null) y = x逻辑。
另外还有一种用Elvis运算符的写法,但不如上面的直观:
y = x ?: y
这个写法的意思是:如果x非null就赋值x给y,否则y保持自身原值。效果和原始需求一致,但可读性不如let写法。
总结
- 若仅需“非null时赋值,null时不操作”:优先用
x?.let { y = it }; - 若需要“非null时赋值,null时终止函数”:可以用
y = x ?: return; ?:运算符的核心是“null时兜底”,根据右边的表达式可以实现不同的兜底逻辑。
内容的提问来源于stack exchange,提问作者BlueSeph
相关产品推荐
相关产品推荐

