首页 > 解决方案 > 如何通过“?.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? 
}

标签: kotlinnull

解决方案


有扩展功能可以实现您正在寻找的东西,您可以在此线程中找到它们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) ->

    }

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


推荐阅读