【问题标题】:Construct a Map for each Enum type in Kotlin为 Kotlin 中的每个 Enum 类型构造一个 Map
【发布时间】:2020-12-04 16:50:30
【问题描述】:

我有一个像这样的枚举类

enum class Definition(
    val definitionName: String,
    val parameters: Map<String, String>,
    val definitionPath: String = "com/1.0"
) {
    APPLE(
        "this-is-an-apple",
        mapOf("1" to "2")
    ),
    BANANA(
        "this-is-banana",
        mapOf("3" to "4")
    )
}

我想为每个枚举构造映射而不指定键和值,例如 APPLE

mapOf("definition" to "this-is-an-apple",
      "parameters" to mapOf("1" to "2"),
      "definitionPath" to "com/1.0"
)

【问题讨论】:

  • 这是干什么用的? (例如,如果您的目标是将其写为 JSON,则最好使用库来进行转换。)
  • 嗨,我在这个枚举中存储了一些预定义的值,这些值将与其他一些动态值合并到一个映射中,以传递给下游服务

标签: dictionary kotlin enums


【解决方案1】:

如果我说得对,您希望将enum 的所有值映射到映射列表。您可以使用values() 函数遍历enum 和Kotlin Reflection API 的每一项:

val maps: List<Map<String, Any>> = Definition.values().map { enumItem ->

    val pairList = mutableListOf<Pair<String, Any>>()

    Definition::class.declaredMemberProperties.forEach { property ->
        val value = property.apply { isAccessible = true }
                        .get(enumItem)
        value?.let { pairList.add(Pair(property.name, it)) }
    }

    mapOf(*pairList.toTypedArray())
}

要使用反射 api,请在应用的 build.gradle 文件依赖项中添加下一行:

implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

【讨论】:

  • 感谢 Sergey,我真正想要实现的是如何不具体说明什么是键和值。就像我能够使用 gson 将数据类转换为地图一样,我想知道如何使用 enum 做类似的事情
  • @YIWENGONG 我认为没有反思我们做不到。请检查我编辑的答案。
  • 非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多