You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:41:57