0

需要调用一个apiMap<String, String>

fun api.log(map: Map<string, String>

但是密钥只能来自已注册的密钥,因此为已注册的密钥定义了一个枚举:

enum class RegisteredKey {
    NONE, ZOOM
}

并首先构建 EnumMap<> 以强制执行键类型:

var enumParamMap: EnumMap<RegisteredKey, String> = EnumMap<RegisteredKey, String>(RegisteredKey::class.java)
    enumParamMap.put(RegisteredKeys.NONE, "0")
    enumParamMap.put(RegisteredKeys.ZOOM, "1")

doLog(enumParamMap)

问题1,有没有构造函数可以直接用数据构建enumMap?

然后需要将 EnumMap 转换为 Map<> 以便 api.log() 接受它

fun doLog(enumParamMap: EnumMap<RegisteredKey, String>) {

    val map: MutableMap<String, String> = mutableMapOf()

    for (enum in enumParamMap.entries) {
        map.put(enum.key.name, enum.value)
    }
    api.log(map)
}

问题2:有没有更简单的方法将 enumMap 映射到常规映射?

4

2 回答 2

2

我不确定我是否正确解释了您的第一个问题,但是如果您的意思是要初始化一个详尽的 EnumMap ,其中每个键都有一个条目,类似于采用 lambda 的 Array 构造函数,您可以这样编写:

inline fun <reified K : Enum<K>, V> exhaustiveEnumMap(init: (key: K) -> V): EnumMap<K, V> {
    val map = EnumMap<K, V>(K::class.java)
    for (key in enumValues<K>())
        map[key] = init(key)
    return map;
}

用法:

val map = exhaustiveEnumMap<RegisteredKey, String> { key -> key.ordinal.toString() }

或者

val map = exhaustiveEnumMap<RegisteredKey, String> { key -> 
    when (key){
        RegisteredKey.NONE -> "0"
        RegisteredKey.ZOOM -> "1"
    }
}

根据您的评论进行编辑:您可以通过mapOf使用这样的 EnumMap 构造函数包装调用来做到这一点,但它将实例化一个中间一次性 LinkedHashMap:

val map = EnumMap(mapOf(RegisteredKey.NONE to "0", RegisteredKey.ZOOM to "1"))

相反,您可以编写一个这样的辅助函数:

inline fun <reified K: Enum<K>, V> enumMapOf(vararg pairs: Pair<K, V>): EnumMap<K, V> =
    pairs.toMap(EnumMap<K, V>(K::class.java))

用法:

var enumParamMap = enumMapOf(RegisteredKey.NONE to "0", RegisteredKey.ZOOM to "1")

--------

对于您的下一个问题,我不确定这是否真的更简单,但您可以这样做:

fun doLog(enumParamMap: EnumMap<RegisteredKey, String>) =
    api.log(enumParamMap.map{ it.key.name to it.value }.toMap())

它更简洁,但是您正在分配一个列表和一些您不会以您的方式进行的对。

于 2019-10-09T15:06:40.843 回答
1

像这样的东西应该适用于初始化:

EnumMap<RegisteredKey, String>(
    mapOf(RegisteredKey.NONE to "0", RegisteredKey.ZOOM to "1")
)

要获得法线贴图,只需调用.toMutableMap()

EnumMap<RegisteredKey, String>(
    mapOf(RegisteredKey.NONE to "0", RegisteredKey.ZOOM to "1")
).toMutableMap()
于 2019-10-09T14:47:36.787 回答