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

Kotlin中如何避免重复的空值检查?

解决Kotlin中重复空值检查的几种实用方案

这里有几个简洁的方法可以去掉FilterMovie(movie.name.orEmpty())里的重复空值检查,同时保持代码清晰:

方案1:一步到位的链式转换过滤

直接把从Category到FilterMovie的空值校验和转换合并到一个mapNotNull操作中,省去中间多余的步骤:

private fun filterName(itemList: List<Category>) {
    val newList = itemList
        .asSequence()
        .mapNotNull { category ->
            // 仅当movie非空且name不为空字符串时,才生成FilterMovie
            category.movie?.name?.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) }
        }
        .toList()
}

逻辑很直观:链式调用会自动跳过null值,takeIf又过滤了空字符串,最后只有符合条件的情况才会返回FilterMovie实例,mapNotNull会自动剔除所有null结果。

方案2:用扩展函数封装转换逻辑

如果这个转换逻辑需要在多个地方复用,给Movie类写个扩展函数是个好主意,把空值检查和转换逻辑封装起来:

// 给Movie添加扩展函数,仅当name非空时返回FilterMovie实例
fun Movie.toFilterMovie(): FilterMovie? {
    return name.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) }
}

// 过滤函数里直接调用扩展函数
private fun filterName(itemList: List<Category>) {
    val newList = itemList
        .asSequence()
        .mapNotNull { it.movie } // 先过滤掉无movie的Category
        .mapNotNull { it.toFilterMovie() } // 转换并过滤掉name为空的情况
        .toList()
}

这样代码职责更清晰,扩展函数可以随时复用,也彻底避免了重复的空值检查。

方案3:简化原有流程的合并写法

如果不想改动太多原有结构,也可以把filterNot和map合并成一个mapNotNull,去掉多余的空值校验:

private fun filterName(itemList: List<Category>) {
    val newList = itemList
        .asSequence()
        .mapNotNull { it.movie }
        .mapNotNull { movie ->
            movie.name.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) }
        }
        .toList()
}

这里用takeIf确保name非空后再构造FilterMovie,mapNotNull会自动过滤掉不符合条件的null结果,不需要再用orEmpty()做兜底。

内容的提问来源于stack exchange,提问作者Compose Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:27:37