清除Scala中的异常处理

时间:2014-04-14 21:31:41

标签: ruby scala scala-collections

在Ruby中,我经常喜欢使用以下函数处理集合中的空值:

def nilstuff(a,stuff="")
  if(a.nil?)
    return stuff
  else
    return a
  end
end

在Scala中,有一种烦恼,即集合中的空值会抛出异常,而不是nil:

val myMap = Map[String, String]()
    myMap += ("Apple" -> "Plant")
    myMap += ("Walrus" -> "Animal")             
    println(myMap("Elephant"))
//Exception in thread "main" java.lang.ExceptionInInitializerError
//  at MyProgram.main(MyProgram.scala)
//Caused by: java.util.NoSuchElementException: key not found: Elephant

有没有办法在Scala中创建一个类似的函数来处理异常并返回“stuff”?

println(missing_stuff(myMap("Elephant"),"Unknown"))

2 个答案:

答案 0 :(得分:4)

您可以为Map添加默认值:

scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala> val myMap = Map[String, String]().withDefaultValue("Unknown")
myMap: scala.collection.mutable.Map[String,String] = Map()

scala> myMap("foo")
res0: String = Unknown

另一个选项是getOrElse的{​​{1}}方法。

或者将模式匹配应用于Map

的结果
get

最后一个可能是你的标题称为“清除异常处理”的最通用的解决方案。

答案 1 :(得分:3)

内置了几种方法。

(1)没有得到价值,可以选择。

myMap.get("Elephant")

现在你有一个Option,你可以用它做各种各样的事情(包括获取其内容或默认值,如果没有):

myMap.get("Elephant").getOrElse("")

(2)获取值或默认值(如果不存在)

myMap.getOrElse("Elephant", "")

(3)使用默认值创建地图(警告 - 这不会在过滤,映射或任何其他方便的集合操作中存在)。在您构建地图后,您不可避免地添加此内容:

val defaultMap = myMap.withDefault(_ => "")
defaultMap("Elephant")

使用可变地图,您可以在开头添加它:

val myMap = new collection.mutable.HashMap[String,String].withDefaultValue("")

(4)当你发现它不存在时,添加你失踪的物品(仅限可变地图):

myMap.getOrElseUpdate("Elephant", "Dumbo")

在这种特殊情况下可能不是你想要的,但通常很有用。