从所有枚举值初始化一个 EnumMap
Initialize an EnumMap from all of enum's values
我有一个枚举 class:
enum class E { A, B, C, D }
初始化包含 E 的所有值作为键(每个键的初始值为 0)的 EnumMap 的最佳方法是什么?
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()
.
一样
我能想到的最简单的方法是:
val map = EnumMap(E.values().associateWith { 0 })
您始终可以为此创建自己的效用函数:
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)
}
val map = EnumMap(EnumSet.allOf(E::class.java).associateWith { 0 })
// {A=0, B=0, C=0, D=0}
或者如果您想要带有 'ordinal' 的地图(枚举中的位置):
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}
我有一个枚举 class:
enum class E { A, B, C, D }
初始化包含 E 的所有值作为键(每个键的初始值为 0)的 EnumMap 的最佳方法是什么?
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()
.
我能想到的最简单的方法是:
val map = EnumMap(E.values().associateWith { 0 })
您始终可以为此创建自己的效用函数:
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)
}
val map = EnumMap(EnumSet.allOf(E::class.java).associateWith { 0 })
// {A=0, B=0, C=0, D=0}
或者如果您想要带有 'ordinal' 的地图(枚举中的位置):
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}