kotlin - 如何通过“?.let”避免嵌套“空检查”?
问题描述
让 kotlin 帮助我避免一些 if(null?) doSomething。
但我有一个问题。
A是对象的字段,B是对象A的字段。它们可以为空。
他们在这样的代码中。
class Obj {
var a : A?
}
class A {
var b : B?
}
我知道我可以通过双重让来做到这一点:
A?.let {
it.B.let {
// a must nonnull
}
}
A?.B?.let {
// how to use A ,without null check again?
}
解决方案
有扩展功能可以实现您正在寻找的东西,您可以在此线程中找到它们https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946
但老实说,你最好只使用基本的 if 检查,如果变量是可变的,你可以将它分配给val
第一个。
val _a = a
val _b = b
if (_a != null && _b != null) {
}
编辑:如果您仍然真的想使用 let,对于这种情况,您可以创建一对并使用takeIf
(a to b)
.takeIf { (a, b) ->
a != null && b != null
}
?.let { (a, b) ->
}
但是,编译器不会将值智能转换为非空值,因此您仍然必须对它们执行非空 (!!) 断言。
推荐阅读
- c# - 在 WPF 中动态地将按钮绑定到数据网格
- javascript - 如何从异步函数中提取输出 - react-native?
- list - 定义范围为有序列表的属性
- google-cloud-platform - gcloud compute scp 找不到文件存储实例
- html - 仅突出显示当前悬停的嵌套列表项
- android - Retrofit、Volley 和 HttpURLConnection 不同的响应
- python - 高效读取 WARC 文件
- haskell - haskell 从“脚本”文件加载数据
- javascript - 如何在 javascript 中将 M3U 播放列表显示为文本
- web-services - 我应该在低负载的应用程序中使用微服务吗?