Scala Map#get和Some()的返回

时间:2012-02-22 06:07:48

标签: scala map

我正在使用scala Map#get函数,对于每个准确的查询,它都会返回Some[String]

是否有一种简单的方法可以删除Some

示例:

def searchDefs{
    print("What Word would you like defined? ")
    val selection = readLine
    println(selection + ":\n\t" + definitionMap.get(selection))
  }

当我使用此方法并使用以下输入时:

What Word would you like defined? Ontology

返回的值为:

Ontology:
    Some(A set of representational primitives with which to model a domain of knowledge or discourse.)

我想删除周围的Some()。

任何提示?

3 个答案:

答案 0 :(得分:34)

有很多方法可以处理Option类型。然而,首先,要意识到拥有它而不是潜在的null引用会有多好!不要试图摆脱它只是因为你习惯了Java的工作方式。

正如其他人最近所说:坚持使用它几周,每次你必须回到不提供Option类型的语言时,你都会呻吟。

至于你的问题,最简单和最危险的方法是:

mymap.get(something).get

.get对象上调用Some检索其中的对象。但是,如果您使用None(例如,如果密钥不在地图中),它会给您一个运行时异常。

更清洁的方法是使用Option.foreachOption.map,如下所示:

scala> val map = Map(1 -> 2)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> map.get(1).foreach( i => println("Got: " + i))
Got: 2

scala> map.get(2).foreach( i => println("Got: " + i))

scala> 

正如您所看到的,当且仅当您具有实际值时,才允许您执行语句。如果OptionNone,则不会发生任何事情。

最后,在Option类型上使用模式匹配也很受欢迎:

scala> map.get(1) match {
     |  case Some(i) => println("Got something")
     |  case None => println("Got nothing")
     | }
Got something

答案 1 :(得分:0)

我个人喜欢使用.getOrElse(String),并使用诸如“无”之类的默认值,即.getOrElse("None")

答案 2 :(得分:0)

我遇到了类似的问题,替换为 .Key() 来解决。 解决方案: 定义地图(选择)