基本Scala散列图 - 返回类型被忽略

mal*_*ngi 1 types scala hashmap

我正在尝试Scala,特别是Hashmap - 我尝试了这些方面的东西(有和没有明确指定类型):

scala> var x = HashMap("a" -> 1, "b" -> 2)
x: scala.collection.immutable.HashMap[java.lang.String,Int] = Map(a -> 1, b -> 2)
scala> x.get("a")
res0: Option[Int] = Some(1)

scala> x.get("a") + x.get("b")
<console>:10: error: type mismatch;
 found   : Option[Int]
 required: String
       x.get("a") + x.get("b")
Run Code Online (Sandbox Code Playgroud)

奇怪的是,即使Int被正确推断,我也无法保留这些Int- 所以,例如,我无法将它们归结为get

我错过了什么吗?

Ben*_*mes 13

看一下get方法的返回类型.它返回Option[Int],而不是Int:

def get (key: A): Option[B]
Run Code Online (Sandbox Code Playgroud)

一个Option[Int]可以是一个Some包含一个整数,或者一个None(如果该键不存在于地图中,你可以得到它).

如果你只是想要一个Int,并且NoSuchElementException如果地图中不存在给定的键可能会抛出,只需使用该apply方法或其较短的语法糖:

x("a") + x("b")
Run Code Online (Sandbox Code Playgroud)

或者,如果你想添加值Option[Int]S,返回另一个Option[Int]:

for (a <- x.get("a"); b <- x.get("b")) yield a + b
Run Code Online (Sandbox Code Playgroud)

Some如果两个键都存在,这将获得一个,如果None缺少一个或两个键.

或者,如果您不关心缺少键并且想要在缺少键时使用默认值,请使用getOrElse:

x.getOrElse("a", 0) + x.getOrElse("b", 0)
Run Code Online (Sandbox Code Playgroud)