如何解决kotlin:如果值为空则退出,否则将该值用作不可为空
本质上这是在标题中。我有一个可能为空的值。如果是这样,我只想用一条消息退出。如果它不为空,那么我需要用这个值做很多工作。
我发现了类似的情况,但不完全是这种情况。正是这种细微的差别让我抓狂。这是我在java中的代码:
if (value == null) {
print("error!");
return;
}
print(value);
doFunStuff(value);
etc(value);
所有使用 value 的方法都要求它不为 null。
但是我在 kotlin 中很难解决这个问题。尽管我尝试了一切,编译器仍然坚持 value 仍然可以为空,并拒绝在函数中使用它。
kotlin 用什么方式来处理这个非常常见的代码流?
解决方法
如果您的方法确实具有非空参数,则 Kotlin 编译器应该足够智能,可以从 Object
智能转换为 Object?
。
fun yourMethod(value: Object?) {
if (value == null) {
print("error!")
return
}
print(value) // Smart cast happens here
doFunStuff(value)
etc(value)
}
fun print(value: Object) {
// Implementation
}
fun doFunStuff(value: Object) {
// Implementation
}
fun etc(value: Object) {
// Implementation
}
但您也可以使用 !!
运算符强制转换(尽管在这种情况下编译器会告诉您没有必要):
fun yourMethod(value: Object?) {
if (value == null) {
print("error!")
return
}
val nonNullValue = value!!
print(nonNullValue)
doFunStuff(nonNullValue)
etc(nonNullValue)
}
fun print(value: Object) {
// Implementation
}
fun doFunStuff(value: Object) {
// Implementation
}
fun etc(value: Object) {
// Implementation
}
,
如果你的值是一个局部变量或者一个函数参数,你就不会有这个问题,因为编译器会将它智能转换为非空。
因此,在这种情况下,我假设 value
是成员属性。
选项 1 是将其复制到局部变量以在函数中使用:
val value = value
if (value == null) {
print("error!")
return
}
print(value)
doFunStuff(value)
etc(value)
选项 2 是使用 let
或 also
作用域函数来做同样的事情,但这在这里可能不是一个好的选择,因为会嵌套太多代码。当您只使用对象调用一两个函数时,这更有用,在这种情况下,您甚至不必命名它(只需将其命名为 it
)。
value.let { value ->
if (value == null) {
print("error!")
return
}
print(value)
doFunStuff(value)
etc(value)
}
如果你的整个函数都使用这个属性,你可以避免这样的嵌套问题,如果你不介意它返回除 Unit 之外的东西:
fun foo() = value.also { value ->
if (value == null) {
print("error!")
return
}
print(value)
doFunStuff(value)
etc(value)
}
选项 3 是每次使用时都断言非空,但这非常难看。只有当您知道只能从调用此函数的同一线程访问该属性时,这才是安全的。
if (value == null) {
print("error!")
return
}
print(value!!)
doFunStuff(value!!)
etc(value!!)
,
好吧,您是否已经尝试过这样的事情而这不是您所期望的?
value?.let { nonNullValue ->
print(nonNullValue);
doFunStuff(nonNullValue);
etc(nonNullValue);
}
基本上,let
块中的代码只有在值不是 null
时才会运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。