2012-02-22 67 views
18

Im的使用Scala的Map#get函数的返回,并为它返回的Some[String]斯卡拉地图#get和一些()

有一个简单的方法来去除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.) 

我想删除一些()周围。

任何提示?

+0

参见:http://stackoverflow.com/questions/9364250/working-with-some-and-option -in-scala – 2012-02-22 07:48:21

+3

关于Option的奇妙之处在于它迫使你处理'None'的情况。 – 2012-02-22 14:55:04

回答

32

有很多方法来处理Option类型。但是,首先要认识到有多好,而不是潜在的null参考!不要因为习惯了Java的工作原理而试图摆脱它。

正如其他人最近所说:坚持它几个星期,你会呻吟,每次你必须回到一种语言不提供Option类型。

现在对于你的问题,最简单和最危险的方法是这样的:

mymap.get(something).get 

一个Some对象上调用.get内获取对象。但是,如果您有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 
+2

'mymap(something)'看起来更漂亮。 – elbowich 2012-02-22 11:57:01

+0

@elbowich:是的,当你知道map中肯定包含'something'时,'mymap(something)'似乎是一个很好的选择。 – cib 2015-08-18 14:03:00