【问题标题】:Koltin return null if value is null else如果值为 null,则 Koltin 返回 null 否则
【发布时间】:2021-11-24 22:17:45
【问题描述】:

我使用 Kotlin 编写的一些业务逻辑。我的方法中有这样的情况——我检查一个值为 null 的值,如果它为 null——我想返回 null,否则做一些逻辑。我的版本如下:

fun calculateFoo(parameter: SomeObject?): ReturnObject? = 
    if (parameter == null) null
    else performCalculation(parameter)

字面意思是“如果值为空,则返回自身,否则处理它”。 通常,如果 value 不为 null,我们会做一些事情,例如 elvis 运算符,但这里是“反转”逻辑。 有没有更好的解决方案?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    退一步说,如果你把它作为一个非空参数的扩展函数,它会在它的调用点更自然地使用。

    fun SomeObject.calculateFoo(): ReturnObject = 
        performCalculation(this)
    
    
    val nullable: SomeObject? = ...
    val result = nullable?.calculateFoo()
    

    我认为对于一个函数来说,最好不要简单地为 null 参数返回 null 以提高代码清晰度,因为它会掩盖调用站点的可空性,?. 调用就足够了,并且可以使代码清楚地了解可能的 null 返回价值。 您的函数的语义原样允许为无用的结果传递无用的参数。

    当然,我知道您的示例是人为的,并且在某些情况下,存在多个参数或空参数在某些情况下只会导致无用的结果,在这种情况下,?.let 的答案会更合适。

    【讨论】:

    • 我喜欢这种方法。 ??? 导致代码更具可读性。
    • 补充一点,如果performCalculation是我们自己的函数,我们可以直接在SomeObject上做一个扩展,去掉这个calculateFoo函数。
    【解决方案2】:

    您可以将?. 运算符与let 结合使用。

    fun calculateFoo(parameter: SomeObject?): ReturnObject? = 
        parameter?.let { performCalculation(it) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多