我试图在scala中将mutable与不可变映射连接起来。
case class Result(val key: String, val number: Int)
object Test extends App {
val map1 = scala.collection.mutable.Map[String, List[Result]]()
val map2: Map[String, List[Result]] = Map("test" -> List(new Result("0", 0)))
map1 ++= map2.map(c => (c -> (c._2 + map1.getOrElse(c._1, List[Result]()))))
}
但编译器总是说:
type mismatch; found : List[Result] required: String
当我将ListResult更改为" test"编译说:
type mismatch; found : java.io.Serializable required: String
我很困惑。我是否以错误的方式使用getOrElse?
问候 Cyrill
答案 0 :(得分:1)
map1 ++= map2.map(c => (c -> (c._2 + map1.getOrElse(c._1, List[Result]()))))
地图上的地图会传递地图的每个元素。所以c是(String, List[Result])
。所以这个
(c -> (c._2 + map1.getOrElse(c._1, List[Result]()))
是((String,List [Result],(List [Result])。哪个错了。我想你的意思
(c._1 -> (c._2 + map1.getOrElse(c._1, List[Result]()))
但仍然存在类型不匹配。我认为你正在遇到隐含的Any2String for +的相当普遍的问题,并且编译器需要一个它不应该的字符串。
无论如何,
(c._1 -> (c._2 ++ map1.getOrElse(c._1, List[Result]()))
似乎有用
map1 ++= map2.map(c => (c._1 -> (c._2 ++ map1.getOrElse(c._1, List[Result]()))))
另外,Nil有点整洁:
map1 ++= map2.map(c => (c._1 -> (c._2 ++ map1.getOrElse(c._1, Nil))))
再次更清楚(IMO)是理解
for ((k,v) <-map2) map1 += (k-> (v ++ map1.getOrElse(k, Nil)))