Kotlin中如何将.not()替换为!运算符?
问题描述
首先给出两个可空类的定义(修正了代码中的语法笔误):
class NullableObject( val a: AnotherNullable? = null, val b: String = "b" ) class AnotherNullable(val id: String) { val hash: Int? = someHashFunction(id) val hashInvalidHash: Boolean = (hash == null) }
原代码通过.not()运算符实现需求:读取hashInvalidHash属性,若nullableObject或其属性a为null,则默认值设为false:
val hasAnotherNullableHash = nullableObject?.a?.hashInvalidHash.not() ?: false
现在需要将代码中的.not()转换为一元取反运算符!,但尝试的写法必须使用!!且无法保留默认值false:
val hasAnotherNullableHash = !nullableObject?.a?.hashInvalidHash!!
解决方案
正确的写法是先通过 Elvis 运算符?:将可空的Boolean?转换为非空布尔值(默认false),再对结果使用一元取反运算符!:
val hasAnotherNullableHash = !(nullableObject?.a?.hashInvalidHash ?: false)
逻辑说明
nullableObject?.a?.hashInvalidHash:如果nullableObject或a为null,返回null;否则返回hashInvalidHash的布尔值。?: false:将上述可空结果转为非空值,若为null则取默认值false。!(...):对最终的非空布尔值取反,完全等价于原代码中.not()的逻辑,同时避免了!!带来的空指针风险。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

