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

Android Studio中使用Kotlin简化Bundle指定键存在校验的方法咨询

Kotlin 优雅读取Bundle参数的实现方案

基础优化:移除冗余逻辑

你现有代码中的containsKey判断属于完全冗余的逻辑:当Bundle中不存在对应Key、Key对应值为null、或值类型不匹配时,getParcelable都会直接返回null,后续的let代码块自然不会执行。仅做基础优化后代码量可减少50%:

bundle.getParcelable<Product>(Extras.PRODUCT)?.let { mpresenter.mProduct = it }
bundle.getParcelable<Animal>(Extras.ANIMAL)?.let { mpresenter.mAnimal = it }

现代化实现:扩展函数+批量处理

针对需要读取十余个甚至更多参数的场景,可以通过Kotlin扩展函数封装模板逻辑,再通过映射列表批量处理,彻底消灭重复代码。

第一步:封装多版本兼容的Parcelable读取扩展

针对Android 13及以上版本对getParcelable方法的变更,先做向下兼容的封装:

import android.os.Build
import android.os.Bundle
import android.os.Parcelable

inline fun <reified T : Parcelable> Bundle.getParcelableCompat(key: String): T? = when {
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getParcelable(key, T::class.java)
    else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}

第二步:批量映射赋值

把所有Key和对应的赋值逻辑整理成映射列表,统一遍历处理,后续新增参数只需新增一行映射即可:

listOf(
    Extras.PRODUCT to { it: Product -> mpresenter.mProduct = it },
    Extras.ANIMAL to { it: Animal -> mpresenter.mAnimal = it },
    // 新增参数直接在此处追加映射关系即可
    Extras.USER to { it: User -> mpresenter.mUser = it },
    Extras.SHOP to { it: Shop -> mpresenter.mShop = it }
).forEach { (key, setter) ->
    bundle.getParcelableCompat<Parcelable>(key)?.let { value ->
        setter(value as Nothing)
    }
}

特殊场景适配

如果你需要明确区分「Key不存在」和「Key存在但值为null」两种场景,才需要保留containsKey判断,可封装对应扩展:

inline fun <reified T : Parcelable> Bundle.getParcelableIfKeyExists(key: String): T? {
    return if (containsKey(key)) getParcelableCompat(key) else null
}

后续读取时直接调用该扩展即可,无需重复写判断逻辑。

内容的提问来源于stack exchange,提问作者Gideon Tobing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 23:24:04