代码之家  ›  专栏  ›  技术社区  ›  samanime

将映射转换为数据类

  •  1
  • samanime  · 技术社区  · 6 年前

    Kotlin中是否有一个简单的方法允许我将映射转换为任意数据类?

    我到处找过,但找不到任何关于用一种非常普通的方式来做这件事的说法。

    我知道我可以用 ObjectMapper

    2 回复  |  直到 6 年前
        1
  •  6
  •   killjoy    6 年前

    为什么不直接使用映射委托呢?

    class MyData(val map: Map<String, String>) {
        val foo by map
        val bar by map
    }
    

    或者可以使用一个伴生对象包装它,并使用 MyData.from(mymap)

    data class MyData(val foo: String, val bar: String) {
        companion object {
            fun from(map: Map<String, String>) = object : {
                val foo by map
                val bar by map
    
                val data = MyData(foo, bar)
            }.data
        }
    
        2
  •  2
  •   Roland    6 年前

    也许 吧 delegated properties

    class YourData { 
      val backedMap = mutableMapOf<String, String>()
      var someProp by backedMap
    }
    
    val obj = YourData().apply {
        someProp = "value"
    }
    

    现在如果 backedMap 是可见的,则也可以添加以下内容,即使不存在任何此类属性:

    obj.backedMap["unknown prop"] = "some other value"
    

    但另一方面,相同的地图可用于自动填充您的字段:

    val sourceMap = mutableMapOf("someProp" to "newValue") // the map you want to use to automatically fill up your data class
    sourceMap.forEach { key, newValue -> obj.backedMap[key] = newValue }
    

    另一种方法是“仅仅”使用反射。这样就省略了备份映射,而只扫描属性,例如:

    val mutableProps = YourData::class.memberProperties.filterIsInstance<KMutableProperty<*>>()
    sourceMap.forEach { key, newValue ->
        mutableProps.forEach {
            if (key == it.name) {
                it.setter.call(obj, newValue)
            }
        }
    }