我正在尝试使用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
我错过了什么吗?
答案 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