【问题标题】:Kotlin .let {} null safetyKotlin .let {} 空安全
【发布时间】:2020-08-19 20:06:26
【问题描述】:

在使用 .let { } 函数时,我注意到在执行以下操作时:

bucket?.assignedVariantName.let { 
    bucket?.determineVariant() <-- guarantee safety for bucket 
}

在这种情况下,您必须保证存储桶的安全性,即存储桶?。或水桶!!而空安全

【问题讨论】:

标签: android kotlin


【解决方案1】:

由于bucket 可以为空,所以你不需要在assignedVariantName 上调用let,这样操作

bucket?.let { 
    it.determineVariant()
}

【讨论】:

    【解决方案2】:

    标准函数 let() 提供 block 作为 lambda 方法表达式以在调用时 callback。因此,它被调用的变量作为 block 的参数传递。

    所以,如果你在安全调用运算符上使用它,它会在回调中为你提供非空变量作为it。你也可以像下面这样重命名它:

    bucket?.assignedVariantName?.let { 
        it.determineVariant() //<-- You can directly use it here
    }
    

    或重命名像任何东西:

    bucket?.assignedVariantName?.let { name ->
        name.determineVariant() //<-- Renaming `it` to `name`
    }
    

    【讨论】:

      【解决方案3】:

      Kotlin .let{} 方法提供空值安全

      bucket?.assignedVariantName?.let { 
          // use `it` as non-null variable
          it.determineVariant()
      }
      

      您需要在 let 块中使用 it 才能使用它。

      【讨论】:

      • 不,它没有。但是添加一个问号就可以了:改用?.let
      • @Cristan 愚蠢的错误。我刚刚添加了它。谢谢
      • it 不会像问题中的 bucket
      【解决方案4】:

      因为 'bucket' 可以是可空变量,所以在 Kotlin 中进行空安全调用的方法有多种,其中一种标准方法是使用带有安全调用运算符的 'let' 函数 -'?'

      所以如果你想在这种情况下保证桶的安全,应该是,

            bucket?.let { nullSafeBucket ->
              nullSafeBucket.assignedVariantName?.let { nullSafeAssignedVariantName ->
                  nullSafeBucket.determineVariant() -- > bucket is null safe
                  //assignedVariantName is as well null safe
              }
          }
      

      }

      重要的注意事项 - 桶!!如果值为 null 将抛出 NPE,这将导致崩溃,因此除非 100% 确定该值不为 null,否则不建议这样做。

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        • 2017-09-02
        • 2023-03-04
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        相关资源
        最近更新 更多