30

私はこの問題の慣用的な解決策を探しています。

Scala(不変)マップを作成valしていますが、オプションで1つ以上のアイテムを追加したいと思います。

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 ???))

考えられる解決策の1つは次のとおりです。

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

これが最善の方法ですか?

4

3 に答える 3

31

の線に沿って何かはどうですか

val optional = if(condition) Seq((key3 -> value3)) else Nil
val entities = Seq(key1 -> value1, key2 -> value2) ++ optional
val aMap = Map(entities:_*)
于 2011-05-18T17:54:24.297 に答える
24

もう1つの可能性は、の反復可能な性質を利用することです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)
于 2015-10-18T20:27:06.247 に答える
11

マップに直接追加できます。

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)
于 2017-06-03T16:27:36.763 に答える