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

时间:2011-09-29 22:17:23

标签: scala types 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")

奇怪的是,即使Int被正确推断,我也无法将其保留为Int - 所以例如,我不能在get

之后对它们求和

我错过了什么吗?

2 个答案:

答案 0 :(得分:13)

查看get方法的返回类型。它返回Option[Int],而不是Int

def get (key: A): Option[B]

Option[Int]可以是包含整数的Some,也可以是None(如果地图中没有该密钥,您可以获得)。

如果您只想要一个Int,并且如果地图中不存在给定的密钥,则可能会抛出NoSuchElementException,只需使用apply方法或其较短的句法糖:

x("a") + x("b")

或者,如果您要在<{em>} 中添加值,请返回另一个Option[Int]

Option[Int]

如果两个密钥都存在,这将为您for (a <- x.get("a"); b <- x.get("b")) yield a + b ,如果缺少一个或两个密钥,则为Some

或者,如果您不关心缺少密钥并希望在缺少密钥时使用默认值,请使用None

getOrElse

答案 1 :(得分:4)

请注意,.get("a")会返回Option[Int]。您甚至无法明确添加Option[Int]。我怀疑String部分是红鲱鱼,因为在范围内有一些隐含的选项转换。如果您从Option打开它们,可以添加它们:

scala> var y = x.get("a").get + x.get("b").get
y: Int = 3