如何在 kotlin 中检查 Double 值是 Null 还是零

use*_*336 6 double if-statement kotlin

如何在 kotlin 中检查 Double 值是 Null 还是零

val ratio:Double? = 0.0

val calRatio = if (ratio == null || ratio == 0.0)
        0.12
    else
        ratio
Run Code Online (Sandbox Code Playgroud)

比率为 null , 0.0 , 0.1

如果比率为空或 0.0,则返回 0.12

并且比率为 0.2 或更大,然后返回相同的比率值

如何检查此算法不使用 if 语句

Sam*_*Sam 11

您可以在 idomatic Kotlin 中编写它,而无需if使用takeUnless.

val ratio: Double? = 0.0
val calRatio = ratio.takeUnless { it == 0.0 } ?: 0.12
Run Code Online (Sandbox Code Playgroud)

takeUnless呼叫检查是否匹配的数目谓语it == 0.0。如果谓词的计算结果为truenull则返回。只有当谓词评估为时才false返回实际数字。

我们可以通过考虑三种可能的情况来了解为什么会这样:

  1. ratio是 时null,谓词的it == 0.0计算结果为false。对 的调用ratio.takeUnless { it == 0.0 }返回 的值ratio,即null。由于其左侧操作数是null,因此?:运算符返回 的右侧值0.12
  2. ratio是 时0.0,谓词的it == 0.0计算结果为true。对 的调用ratio.takeUnless { it == 0.0 }忽略 的值,ratio而是返回null。由于其左侧操作数是null,因此?:运算符返回 的右侧值0.12
  3. ratio是任何非空、非零数字时,谓词的it == 0.0计算结果为false。调用ratio.takeUnless { it == 0.0 }返回 的值ratio,即原始数字。由于其左侧操作数不为空,因此该?:运算符返回左侧值。

  • 我倾向于使用 takeIf 代替 takeUnless 以提高可读性。当阅读代码时,我相信更容易看到积极的陈述。在我看来,ratio.takeIf { it != 0.0 } ?: 0.12 比ratio.takeUnless { it == 0.0 } ?: 0.12 更容易理解 (3认同)