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

时间:2015-12-17 10:20:05

标签: kotlin

我想否定以下表达式:

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

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

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

IDE(Android Studio)告诉我

  

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

我如何否定这种表达方式?

3 个答案:

答案 0 :(得分:7)

您可以使用可以为空的引用。

 SpUtils.loadEMail()?.isEmpty()

此代码生成类型布尔值的值,其平均表达式可以返回布尔 null 的实例。

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

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

您尝试否定布尔值而不是布尔elvis运算符返回!

答案 1 :(得分:2)

?.safe call operator

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

  • 如果loadEmail()调用的结果不是 null
  • ,则为布尔值
  • null否则

!是一个built-in布尔运算,它调用名为package.Boolean的{​​{1}}运算符,该运算符仅适用于非可空引用。 not()的结果为?.,因此您会收到错误消息。

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

Boolean?

如果您想取消只是 !(SpUtils().loadEMail()?.isEmpty() ?: false) 部分,那么正确的变体将是:

SpUtils().loadEMail()?.isEmpty()

如果!(SpUtils().loadEMail()?.isEmpty() ?: true) 的结果为空(没有邮件),那么elvis运营商将返回?.(没有电子邮件),你将否定它。

答案 2 :(得分:0)

private static List<T> RunQuery<T>(string query, object parameters = null) { return WithCache(query, parameters, () => RunNoCacheQuery<T>(query, parameters)); } private static List<T> RunNoCacheQuery<T>(string query, object parameters = null) { using (var conn = ConnectionFactory.GetConnection()) { conn.Open(); var data = conn.Query<T>(query, parameters).ToList(); conn.Close(); return data; } } 可行,但实际上很难看到!(SpUtils().loadEMail()?.isEmpty() ?: false)

true的结果为空或不为空时,它返回true。有了这些知识,我们就可以轻松地做出可读的东西:

SpUtils().loadEMail()

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

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