kotlin - 如何避免 "?.let"的嵌套「空检查」?

标签 kotlin null

让 kotlin 帮助我避免一些 if(null?) doSomething。

但是我有一个问题。

A是对象的字段,B是对象A的字段,可以为nullbale。

他们的代码是这样的。

class Obj {
   var a : A?
}

class A {
   var b : B?
}

我知道我可以通过 double let 做到这一点:

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) ->

    }

但是编译器不会将值智能转换为非空值,因此您仍然必须对它们执行非空 (!!) 断言。

关于kotlin - 如何避免 "?.let"的嵌套「空检查」?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56764419/

相关文章:

mysql - 如何在 MySQL 中将 IFNULL 与窗口函数一起使用

java - 关于创建 OnetoMany、ManyToOne 映射的 Hibernate 问题给出 null

c# - DDD 中的空实体

unit-testing - 使用 PowerMock 在 Kotlin 中模拟包级函数

Kotlin 类的 Android 单元测试失败,返回 "cannot find symbol class ..."

kotlin - 如何在Kotlin中评估由String表示的 bool 表达式?

android - 包名称与正则表达式不匹配

java - 如何从二维数组中删除空值?

kotlin - Kotlin 语言是如何用 Kotlin 编写的?

python - 在 Python Pandas 中将 NaN 转换为 Oracle Null