(可选)将项添加到Scala Map

Ral*_*lph 27 scala immutability optional-values

我正在寻找这个问题的惯用解决方案.

我正在构建一个valScala(不可变)地图,并希望可选择添加一个或多个项目:

val aMap =
  Map(key1 -> value1,
      key2 -> value2,
      (if (condition) (key3 -> value3) else ???))
Run Code Online (Sandbox Code Playgroud)

如何在不使用var?的情况下完成?什么应该取代????使用+运营商更好吗?

val aMap =
  Map(key1 -> value1,
      key2 -> value2) +
  (if (condition) (key3 -> value3) else ???))
Run Code Online (Sandbox Code Playgroud)

一种可能的解决方案是

val aMap =
  Map(key1 -> value1,
      key2 -> value2,
      (if (condition) (key3 -> value3) else (null, null))).filter {
        case (k, v) => k != null && v != null
      }
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?

sbl*_*ndy 30

怎么样的东西

val optional = if(condition) Seq((key3 -> value3)) else Nil
val entities = Seq(key1 -> value1, key2 -> value2) ++ optional
val aMap = Map(entities:_*)
Run Code Online (Sandbox Code Playgroud)

  • 或者简单地将`val aMap = entities.toMap`作为最终值. (3认同)
  • 太好了!我也可以做`Map(...)++(if(condition)Seq((key3 - > value3))else else Nil)` (2认同)

Ero*_*ght 19

另一种可能性是利用可迭代的性质Option.

非空值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)
Run Code Online (Sandbox Code Playgroud)

空值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)
Run Code Online (Sandbox Code Playgroud)


Mah*_*afy 7

您可以直接添加到地图:

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)
Run Code Online (Sandbox Code Playgroud)