2

我有一个枚举类:

enum class E { A, B, C, D }

初始化包含所有 E 值作为键的 EnumMap 的最简洁方法是什么,每个键的初始值都为 0?

val map = ...?
assert(map is EnumMap<E, Int>)
assert(map[E.A] == 0)
assert(map[E.B] == 0)
assert(map[E.C] == 0)
assert(map[E.D] == 0)

我能想到的最简洁的是:

val map = E.values().associateWithTo(EnumMap(E::class.java)) { 0 }

但是,名称的重复E打破了 DRY 原则。而且这个词associateWithTo有点拗口。有没有更简洁易读的方式?我希望有类似的EnumMap.allOf()东西EnumSet.allOf()

4

3 回答 3

6

我能想到的最简单的方法是:

val map = EnumMap(E.values().associateWith { 0 })
于 2021-11-25T21:54:44.187 回答
3

为此,您始终可以创建自己的实用程序函数:

fun main() {
    val map = enumMap<E, Int> { 0 }
}

inline fun <reified E : Enum<E>, V> enumMap(valueSelector: (E) -> V): EnumMap<E, V> {
    return enumValues<E>().associateWithTo(EnumMap(E::class.java), valueSelector)
}
于 2021-11-25T21:55:34.970 回答
3
val map = EnumMap(EnumSet.allOf(E::class.java).associateWith { 0 })
// {A=0, B=0, C=0, D=0}

或者,如果您想要带有“序数”(枚举中的位置)的地图:

val map = EnumMap(EnumSet.allOf(E::class.java).associateWith(E::ordinal))
// {A=0, B=1, C=2, D=3}

这将是具有自定义属性的枚举版本:

enum class E(val value: String) {
  A("AAA"),
  B("BBB"),
  C("CCC"),
  D("DDD")
}

val map = EnumMap(EnumSet.allOf(E::class.java).associateWith(E::value))
// {A=AAA, B=BBB, C=CCC, D=DDD}
于 2021-11-25T22:03:33.880 回答