在选项[地图]上的键/值上方映射

时间:2015-05-06 20:29:40

标签: scala

我正在尝试从Option [Map]中提取键/值。只有当Option实际上有一个Map时,迭代地图中包含的键/值的最简单方法是什么?

这是一个突出我问题的简单示例。

val values = Option(Map("foo" -> 22, "bar" -> 23))
values map { case (key, value) => println(s"$key = $value") }  

这无法编译。

 <console>:12: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: scala.collection.immutable.Map[String,Int]
              values map { case (key, value) => println(s"$key = $value") }
                                ^

如果Map未包含在Option中,那么它的工作正常。

val values = Map("foo" -> 22, "bar" -> 23)
values map { case (key, value) => println(s"$key = $value") }

2 个答案:

答案 0 :(得分:5)

您还需要另一个map,因为第一个map适用于Option,这意味着您的lambda正在尝试匹配单个键值对,当它是&#39;确实是Map中包含的完整Option

values.map(a => ???)
           ^ This is a Map[String, Int]

从语法上讲,你想要这个:

values.map(_.map { case (key, value) => println(s"$key = $value") })

但这并不是真正意义上的map,它更像foreach,因为它只会产生副作用。

values.foreach(_.foreach { case (key, value) => println(s"$key = $value") })

或者为了理解:

for {
    map <- values
    (key, value) <- map
} println(s"$key = $value")

答案 1 :(得分:2)

您可以使用getOrElse打开地图。

val values = Option(Map("foo" -> 22, "bar" -> 23))
values getOrElse Map() foreach { case (key, value) => println(s"$key = $value") }