Scala Try/Option为null

Scala Try/Option为null,scala,Scala,我正在scala中搜索一种可能性,即调用函数并获得一个选项作为结果,如果调用该方法时引发异常或该方法返回null,则结果为“无”。否则,该选项应具有结果的值 我知道第一部分可以使用Try,但我不知道如何处理第二部分: val result = Try(myFunction).toOption() 如果该方法现在返回null(因为它不是scala函数而是Java函数),结果是Some(null),而不是None,正如我所知,scala标准库中只有一个方法可以将null转换为None-选项。应用(

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

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

val result = Try(myFunction).toOption()

如果该方法现在返回null(因为它不是scala函数而是Java函数),
结果是
Some(null)
,而不是
None
,正如我所知,scala标准库中只有一个方法可以将
null
转换为
None
-
选项。应用(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)

您还可以通过以下方式进行模式匹配:

val result = myFunction() match {
   case null => None
   case _    => Some(_)
}
但是@senia的答案看起来更像“scala风格”

您也可以这样做:

val result = Try(myFunction).toOption.filter(_ != null)

哪个看起来和感觉都比
.flatte
.flatMap(选项())好

这可以包装起来,这样我就不用写那么多东西了吗?