在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"))
答案 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")
在这种特殊情况下可能不是你想要的,但通常很有用。