能否在Kotlin的when语句中用智能类型转换消除!!非空断言?
Kotlin避免非空断言的优雅方案
你的代码中因为使用了var类型的可空变量,编译器无法确保在判断variableX != null后变量不会被其他线程修改为null,因此无法自动智能转换为非空类型,导致必须用!!断言。以下是几种更优雅的解决方式:
方式一:使用序列查找第一个非空实例
这种方式最简洁,适合依次检查多个可空变量的场景:
class Sample { var variable1: SomeClass? = null var variable2: SomeClass? = null var variable3: SomeClass? = null fun checkVariable() { sequenceOf(variable1, variable2, variable3) .firstOrNull() // 等价于firstOrNull { it != null } ?.doSomething() } }
方式二:结合takeIf与run链式调用
通过链式调用依次检查,逻辑清晰直观:
class Sample { var variable1: SomeClass? = null var variable2: SomeClass? = null var variable3: SomeClass? = null fun checkVariable() { variable1.takeIf { it != null }?.run { doSomething() } ?: variable2.takeIf { it != null }?.run { doSomething() } ?: variable3.takeIf { it != null }?.run { doSomething() } } }
方式三:用let绑定非空实例到分支
贴合原when结构的写法,明确每个分支的执行逻辑:
class Sample { var variable1: SomeClass? = null var variable2: SomeClass? = null var variable3: SomeClass? = null fun checkVariable() { when { variable1?.let { it.doSomething() true } == true -> Unit variable2?.let { it.doSomething() true } == true -> Unit variable3?.let { it.doSomething() true } == true -> Unit } } }
补充:如果变量是val类型
如果你的变量是不可变的val,编译器可以安全地进行智能转换,此时直接去掉!!即可:
class Sample { val variable1: SomeClass? = null val variable2: SomeClass? = null val variable3: SomeClass? = null fun checkVariable() { when { variable1 != null -> variable1.doSomething() variable2 != null -> variable2.doSomething() variable3 != null -> variable3.doSomething() } } }
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

