在Kotlin中将Map转换为自定义Bundle对象
将Map转换为自定义Bundle对象的解决方案
嘿,我来帮你搞定把Map转换成自定义Bundle对象的问题!根据你给出的Bundle类代码片段,我整理了几种实用的实现方式,你可以根据自己的需求选择:
方法1:手动映射(最安全可控)
这种方式直接在init块里遍历Map,把对应键的值赋值给Bundle的属性,类型转换用as?避免崩溃,还能保留你想要的默认值:
class Bundle(map: Map<String, Any>) { var version: String? var app: String? var countries: ArrayList<Any>? var currency: ArrayList<Any>? var force: Boolean? var name: String? var service: ArrayList<Any>? var money: Int? init { // 先初始化默认值 version = null app = null countries = arrayListOf() currency = arrayListOf() force = true name = null service = arrayListOf() money = null // 从Map中匹配键赋值 map.forEach { (key, value) -> when (key) { "version" -> version = value as? String "app" -> app = value as? String "countries" -> countries = value as? ArrayList<Any> "currency" -> currency = value as? ArrayList<Any> "force" -> force = value as? Boolean "name" -> name = value as? String "service" -> service = value as? ArrayList<Any> "money" -> money = value as? Int // 处理未知键,可选 else -> println("忽略未知键: $key") } } } }
为什么推荐这个? 完全可控,能明确处理每个属性的类型转换,就算Map里的类型不匹配,也只会给属性赋值null而不会抛出异常,调试起来也方便。
方法2:用Kotlin反射简化代码(适合属性较多的场景)
如果你的Bundle属性特别多,手动写when分支太麻烦,可以用反射自动匹配属性名和Map的键:
import kotlin.reflect.full.memberProperties class Bundle(map: Map<String, Any>) { var version: String? = null var app: String? = null var countries: ArrayList<Any>? = arrayListOf() var currency: ArrayList<Any>? = arrayListOf() var force: Boolean? = true var name: String? = null var service: ArrayList<Any>? = arrayListOf() var money: Int? = null init { this::class.memberProperties.forEach { prop -> // 只处理可变属性(var修饰的) if (prop is kotlin.reflect.KMutableProperty<*>) { val mapValue = map[prop.name] try { // 给属性赋值 prop.setter.call(this, mapValue) } catch (e: ClassCastException) { // 类型不匹配时的容错处理 println("键${prop.name}类型不匹配: 期望${prop.returnType}, 实际${mapValue?.javaClass}") } } } } }
注意事项:反射性能会比手动映射稍差,而且如果属性名和Map的键名不一致就会失效;另外在Android等需要混淆的环境中,要记得给Bundle类添加混淆规则,避免反射找不到属性。
方法3:改用Data Class(更简洁规范)
如果允许修改Bundle类的结构,推荐改成Kotlin的Data Class,自带equals、hashCode等方法,还能写一个静态的fromMap方法来转换:
data class Bundle( val version: String? = null, val app: String? = null, val countries: ArrayList<Any>? = arrayListOf(), val currency: ArrayList<Any>? = arrayListOf(), val force: Boolean? = true, val name: String? = null, val service: ArrayList<Any>? = arrayListOf(), val money: Int? = null ) { companion object { // 从Map生成Bundle的方法 fun fromMap(map: Map<String, Any>): Bundle { return Bundle( version = map["version"] as? String, app = map["app"] as? String, countries = map["countries"] as? ArrayList<Any>, currency = map["currency"] as? ArrayList<Any>, // 如果Map里没有force或者类型不对,保留默认值true force = map["force"] as? Boolean ?: true, name = map["name"] as? String, service = map["service"] as? ArrayList<Any>, money = map["money"] as? Int ) } } }
使用方式:直接调用Bundle.fromMap(yourMap)就能得到Bundle对象,代码简洁易读,还符合Kotlin的最佳实践。
内容的提问来源于stack exchange,提问作者Manu13k
相关产品推荐
相关产品推荐

