我在scala中搜索一个可能性来调用一个函数并获得一个Option
结果为“无”,如果在调用方法时引发异常或方法返回null。否则,Option应该具有结果的值。
我知道Try
可用于第一部分,但我不知道如何处理第二部分:
val result = Try(myFunction).toOption()
如果方法现在返回null(因为它不是scala函数而是Java函数),result
是Some(null)
而不是None
。
答案 0 :(得分:21)
据我所知,scala标准库中只有一种方法可以将null
转换为None
- Option.apply(x)
,因此您必须手动使用它:
val result = Try(myFunction).toOption.flatMap{Option(_)}
// or
val result = Try(Option(myFunction)).toOption.flatten
您可以像这样创建自己的帮助方法:
implicit class NotNullOption[T](val t: Try[T]) extends AnyVal {
def toNotNullOption = t.toOption.flatMap{Option(_)}
}
scala> Try(null: String).toNotNullOption
res0: Option[String] = None
scala> Try("a").toNotNullOption
res1: Option[String] = Some(a)
答案 1 :(得分:4)
你也可以这样做:
val result = Try(myFunction).toOption.filter(_ != null)
,其外观和感觉优于.flatten
或.flatMap(Option(_))
答案 2 :(得分:0)
您还可以将模式匹配视为:
val result = myFunction() match {
case null => None
case _ => Some(_)
}
但@senia的答案看起来更“scala style”