我正在尝试从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") }
答案 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") }