trait - Opcionalmente, agregar elementos a un mapa de Scala
scala functions (3)
¿Qué tal algo a lo largo de las líneas de
val optional = if(condition) Seq((key3 -> value3)) else Nil
val entities = Seq(key1 -> value1, key2 -> value2) ++ optional
val aMap = Map(entities:_*)
Estoy buscando una solución idiomática para este problema.
Estoy creando un val
Scala (inmutable) Mapa y me gustaría agregar opcionalmente uno o más elementos:
val aMap =
Map(key1 -> value1,
key2 -> value2,
(if (condition) (key3 -> value3) else ???))
¿Cómo se puede hacer esto sin usar una var
? ¿Qué debería reemplazar el ???
? ¿Es mejor usar el operador +
?
val aMap =
Map(key1 -> value1,
key2 -> value2) +
(if (condition) (key3 -> value3) else ???))
Una posible solución es:
val aMap =
Map(key1 -> value1,
key2 -> value2,
(if (condition) (key3 -> value3) else (null, null))).filter {
case (k, v) => k != null && v != null
}
Es esta la mejor manera?
Otra posibilidad es aprovechar la naturaleza iterable de la Option
.
Un valor no vacío o
:
scala> val o = Some(''z'' -> 3)
scala> (Seq(''x'' -> 1, ''y'' -> 2) ++ o).toMap
res1: scala.collection.immutable.Map[Char,Int] = Map(x -> 1, y -> 2, z -> 3)
Un valor vacío o
:
scala> val o = None
scala> (Seq(''x'' -> 1, ''y'' -> 2) ++ o).toMap
res2: scala.collection.immutable.Map[Char,Int] = Map(x -> 1, y -> 2)
Puedes añadir directamente al mapa:
scala> val map = Map(1 -> 2, 3 -> 4)
scala> val some = Some(5 -> 6)
scala> val none = None
scala> val combinedMap = map ++ some ++ none
combinedMap: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4, 5 -> 6)