Tengo una clase de enumeración:
enum class E { A, B, C, D }¿Cuál es la mejor manera de inicializar un EnumMap que contiene todos los valores de E como claves, cada uno con un valor inicial de 0?
val map = ...? assert(map is EnumMap<E, Int>) assert(map[EA] == 0) assert(map[EB] == 0) assert(map[EC] == 0) assert(map[ED] == 0)Lo más conciso que se me ocurre es:
val map = E.values().associateWithTo(EnumMap(E::class.java)) { 0 } Sin embargo, la repetición del nombre E rompe el principio DRY. Y la palabra associateWithTo es un poco complicada. ¿Hay una manera más concisa y legible? Desearía que hubiera algo como EnumMap.allOf() al igual que EnumSet.allOf() .
La forma más simple que se me ocurre es:
val map = EnumMap(E.values().associateWith { 0 })Siempre puede crear su propia función de utilidad para este propósito:
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}O si desea el mapa con el 'ordinal' (la posición en la enumeración):
val map = EnumMap(EnumSet.allOf(E::class.java).associateWith(E::ordinal)) // {A=0, B=1, C=2, D=3}Esta sería la versión para enumeraciones con propiedades personalizadas:
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}