what trait pattern functions companion classes basics scala immutability optional-values

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)