合并两个地图时无法添加值

时间:2018-09-25 00:22:16

标签: scala

val map1: Map[Int, Double] = ...
map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) }

[ERROR] ...<code location>...: error: overloaded method value + with alternatives:
[ERROR]   (x: Double)Double <and>
[ERROR]   (x: Float)Double <and>
[ERROR]   (x: Long)Double <and>
[ERROR]   (x: Int)Double <and>
[ERROR]   (x: Char)Double <and>
[ERROR]   (x: Short)Double <and>
[ERROR]   (x: Byte)Double <and>
[ERROR]   (x: String)String
[ERROR]  cannot be applied to (AnyVal)
[ERROR]         .map{ case (k, v: Double)  => k -> (v + map1.getOrElse(k, 0)) }
[ERROR]                                               ^

在该+的一侧,有v: Double;另一方面,Map[Int, Double]中有一个getOrElse。此添加项必须为Double + Double。这个错误是从哪里来的?

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

map1.getOrElse(k,0:Double) or map1.getOrElse(k,0d)

map1.getOrElse(k,0)将返回Any类型,因为此处将0视为Integer:

scala> map1.getOrElse(1,0)
res11: AnyVal = 2.0

答案 1 :(得分:1)

让我们说

ReadLine

现在使用

val map1 = Map(1->2.0,2->3.0,3->4.0,4->5.0,5->6.0)
val map2 = Map(1->2.5,3->1.0,4->3.2,7->3.0,6->1.23)

代替

 map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0.0)) }

您用map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) } Int代替0 Double。这就是为什么将0.0方法返回的type推断为getOrElse的原因。未将运算符AnyVal定义为重载为+。当两者均为Double + AnyVal时,将按预期正确推断,因为Double+上已定义。 Double方法返回与提供的特定getOrElse value关联的Doublekey),如果未找到该特定k(Int),则应返回仅适用于k,即在这种情况下为Double,否则它将返回0.0AnyVal,具体取决于我们提供的Any或{{1 }}作为Int函数的第二个参数。

在Scala REPL中:

String