我试图将可变对象与scala中的不可变映射连接起来。
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更改为“测试”时,编译器说:
type mismatch; found : java.io.Serializable required: String
我很困惑我会错误地使用getOrElse吗?
问候
西里尔
最佳答案
map1 ++= map2.map(c => (c -> (c._2 + map1.getOrElse(c._1, List[Result]()))))
map 上的 map 会传递 map 的每个元素。所以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的相当普遍的问题,编译器希望在不应该的地方使用String。
无论如何,
(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)))
关于scala - 使用getOrElse连接两个映射时,类型不匹配编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947664/