首页 文章

在kotlin中使用elvis运算符时如何否定布尔表达式?

提问于
浏览
10

我想否定以下表达式:

return SpUtils.loadEMail()?.isEmpty() ?: false

如果我添加一个!在表达之前,就像

return !SpUtils.loadEMail()?.isEmpty() ?: false

IDE(Android Studio)告诉我

在kotlin.Boolean类型的可空接收器上只允许安全(? . )或非空断言(!! . )调用?

我怎么否定这种表达方式呢?

3 回答

  • 6

    你有可空引用的问题 .

    SpUtils.loadEMail()?.isEmpty()
    

    此代码生成 Boolean? 类型的值,其平均表达式可以返回 Booleannull 的实例 .

    我建议使用以下代码来解决您的问题:

    return !(SpUtils().loadEMail()?.isEmpty() ?: false);
    

    你尝试否定 Boolean? 而不是 Booleanelvis运算符返回!

  • 0

    ?.safe call operator .

    在这种情况下,它会返回:

    • 布尔值,如果 loadEmail() 调用的结果 is not null

    • null 否则

    ! 是一个built-in布尔操作,它调用 package.Boolean 的名为 not() 的运算符,该运算符仅适用于非可空引用 . ?. 的结果是 Boolean? ,因此您得到错误 .

    如果你想否定整个表达,你可以坚持iRus的答案:

    !(SpUtils().loadEMail()?.isEmpty() ?: false)
    

    如果你想否定 just SpUtils().loadEMail()?.isEmpty() 部分,那么正确的变体将是:

    !(SpUtils().loadEMail()?.isEmpty() ?: true)
    

    如果 ?. 的结果为空(没有邮件),那么elvis操作员将返回 true (没有电子邮件),你将否定它 .

  • 2

    !(SpUtils().loadEMail()?.isEmpty() ?: false) 会起作用,但很难看出这实际上何时会返回 true .

    SpUtils().loadEMail() 的结果为空或非空时,它返回 true . 有了这些知识,我们可以轻松地做出可读的东西:

    return SpUtils().loadEMail()?.isNotEmpty() ?: true

    您可以扩展它以获得更好的可读性:

    val email = SpUtils().loadEMail()
    if (email == null || email.isNotEmpty()) {
        return true
    }
    return false
    

相关问题