Scala:在带有嵌套Map的Map上使用toMap失败

时间:2017-11-06 19:00:09

标签: scala

在我的代码中,我有以下Map定义了嵌套映射,我想使用函数getTags获取Map的这个值(嵌套Map),这会产生以下错误:

scala> def getTags(tags: Map[String, Map[String, List[String]]]): Map[String, List[String]] = {
     |     tags.map {_._2}.toMap
     | }
<console>:12: error: Cannot prove that Map[String,List[String]] <:< (T, U).
           tags.map {_._2}.toMap
                           ^                                                                        ^

我已经确认在使用toMap函数之前,我得到的错误是:

scala> def getTags(tags: Map[String, Map[String, List[String]]]): Map[String, List[String]] = {
     | tags.map {_._2}
     | }
<console>:12: error: type mismatch;
 found   : scala.collection.immutable.Iterable[Map[String,List[String]]]
 required: Map[String,List[String]]
       tags.map {_._2}
                ^

因此toMap之前返回的类型为Iterable[Map[String, List[String]]]

如何抓住Map[String, List[String]]

感谢对此问题的任何帮助。

2 个答案:

答案 0 :(得分:1)

错误是因为函数Map[String, List[String]]的返回类型表示您将返回单个Map。但是你的功能:

def getTags(tags: Map[String, Map[String, List[String]]]): Map[String, List[String]] = {
  tags.map(_._2)
}

会返回多个Maps,因为调用.map会返回Iterable。要修复错误,您可以执行以下操作:

def getTags(tags: Map[String, Map[String, List[String]]]): Map[String, List[String]] = {
  tags.map(_._2).head
}

但这可能不是你的逻辑应该是什么,并且如果地图是空的,也会抛出异常。

答案 1 :(得分:0)

尝试将Map()转换为toList,这可能对您有所帮助