kotlin if(bar == null)vs bar?:run

这里是示例

if (bar == null) { // do something } 

 bar ?: run { // do something. } 
  1. 哪一个是最佳实践?
  2. 什么是变异财产?
  3. 第一个不和变异的财产工作?

哪一个是最佳实践?

正如Oliver所指出的那样,当使用if(bar == null)时,意图是非常明确的。 这也是检查空条件下官方Kotlin文档中使用的方法。

虽然我不建议在这种情况下,Kotlin允许你做这样的整洁的事情:

 inline fun whenNull(input: Any?, block: () -> Unit) { if(input == null) block() } 

这将允许你重写if(bar == null)如下:

 whenNull(bar) { // Do something } 

什么是变异财产?

这是一个值可以改变的variables。 基本上,variables声明使用var而不是val

第一个不和变异的财产工作?

这与您的示例不相关,因为您正在检查if(bar == null)

如果你正在检查if(bar != null)你所指的是相关的。 在这种情况下,如果bar是一个var ,那么Kotlin就不能智能地将它转换为一个非nulltypes,因为在bar的值可以随时改变的情况下。 这意味着if你必须在bar?. )上打安全电话,或使用!!

您可以通过执行以下操作来解决此问题:

 val b = bar if(b != null) { // b has been smart cast to a non-null type } 

因为它是不可变的( val ),所以Kotlin能够聪明地将b转换成非空types。

或者,你可以使用一个安全的调用,并let调用指定的函数/块作为它的参数,并返回其结果。 给定安全的调用, this当然是非空的。

 bar?.let { // this is bar (non-null) }