Scala Map#get和Some()的返回

mer*_*ley 20 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))
  }
Run Code Online (Sandbox Code Playgroud)

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

What Word would you like defined? Ontology
Run Code Online (Sandbox Code Playgroud)

返回的值是:

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

我想删除周围的Some().

有小费吗?

Fra*_*ank 35

有很多方法可以处理这种Option类型.然而,首先,要意识到拥有它而不是潜在的null参考是多么好!不要试图摆脱它只是因为你习惯了Java的工作原理.

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

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

mymap.get(something).get
Run Code Online (Sandbox Code Playgroud)

调用.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> 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当且仅当您具有实际值时,才允许您执行语句.如果OptionNone相反,什么都不会发生.

最后,在这样的Option类型上使用模式匹配也很流行:

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

  • `mymap(something)`看起来更漂亮. (2认同)