尝试使用null / Option

时间:2014-01-20 10:57:43

标签: scala

我在scala中搜索一个可能性来调用一个函数并获得一个Option结果为“无”,如果在调用方法时引发异常或方法返回null。否则,Option应该具有结果的值。

我知道Try可用于第一部分,但我不知道如何处理第二部分:

val result = Try(myFunction).toOption()

如果方法现在返回null(因为它不是scala函数而是Java函数),resultSome(null)而不是None

3 个答案:

答案 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”