【问题标题】:Optionally adding items to a Scala Map可以选择将项目添加到 Scala 地图
【发布时间】:2011-05-18 17:46:04
【问题描述】:

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

我正在构建一个val Scala(不可变)映射,并希望添加一个或多个项目:

val aMap =
  Map(key1 -> value1,
      key2 -> value2,
      (if (condition) (key3 -> value3) else ???))

如何在不使用var 的情况下做到这一点?应该用什么替换????使用+ 运算符更好吗?

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

一种可能的解决方案是:

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

这是最好的方法吗?

【问题讨论】:

    标签: scala immutability optional-values


    【解决方案1】:

    类似的东西怎么样

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

    【讨论】:

    • 不错!我也可以Map(...) ++ (if(condition) Seq((key3 -> value3)) else Nil)
    • 或者干脆val aMap = entities.toMap作为最终值。
    【解决方案2】:

    另一种可能性是利用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)
    

    一个空值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)
    

    【讨论】:

    • 我更喜欢这种方法。比公认的答案更干净
    【解决方案3】:

    您可以直接添加到地图中:

    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)
    

    【讨论】:

    • 不错。这本质上是使用选项可迭代的性质。这里 ++ 是别名 concat,您可以将 Tuple2 的任何 IterableOnce 连接到 Tuple2 中的类型匹配的 Map。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多