【问题标题】:How to convert data class to map如何将数据类转换为地图
【发布时间】:2020-08-30 12:27:24
【问题描述】:

我尝试转换为数据类来映射。 (代码下面只是示例代码)

data class User (
  val name : String = "",
  val age : Int = 0,
  val deviceGroup: MutableSet<DeviceGroup> = mutableSetOf()
)
data class DeviceGroup (
  val name : String = "",
  val deviceLink : MutableSet<DeviceLink> = mutableSetOf()
)
data class DeviceLink (
  val id : Int = 0,
  val device : Device
)
data class Device (
  val devId : Int = 0,
  val name : String = ""
)

fun main (request : HttpServletRequest) {
  val currentUser = request.session.getAttribute("user") as User
  val data = userRepository.findByName(currentUser.name)
  
  // return currentUser
  // result is {name="test", age=17, deviceGroup = [{name="group1"}, {name="group2"}]}
  
  // I want deserialization data class to Map
  val response = data.deviceGroup.toMap()
  
  response.deivceGroup.forEach {
    // And add new key, pair
    it.add(Map<String, MutableSet<Device>>("devices", mutableSetOf()))

    // Lastly, I want put in the value    
deviceGroupRepository.findByName(it.name).deviceLink.forEach {
      it.devices.add(this)
    }
  }
  
  return response
}

如果只返回数据值,则结果为 "{name="test", age=17, deviceGroup = [{name="group1"}, {name="group2"}]}"

如何将数据类转换为 Map 对象并添加新的密钥对?

【问题讨论】:

    标签: json spring kotlin


    【解决方案1】:

    使用associate 将集合变成地图

    Kotlin 标准库提供了一个名为associate 的函数,它将获取对象集合并将它们转换为地图。它有一个参数,它是一个指定映射的键和值应该是什么的函数。

    例如,在您的情况下,您可以这样称呼它:

    val response = data.deviceGroup.associate { it.name to it.deviceLink }
    

    它将返回一个Map&lt;String, MutableSet&lt;DeviceLink&gt;&gt;,其中键是设备组的name,值是deviceLink 集合。


    添加新值的最简单方法就是将它们附加到 + 运算符。

    val response = data.deviceGroup.associate { 
        it.name to it.deviceLink 
    } + mapOf("device" to emptySet())
    

    如果您需要更多控制权,可以使用.toMutableMap(),以便可以使用put 添加新条目。

    val response = data.deviceGroup.associate { 
        it.name to it.deviceLink 
    }.toMutableMap()
    response.put("device", emptySet())
    

    【讨论】:

    • 你只是手动创建一个映射...如何序列化一个对象自动映射?
    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多