Scala Try/Option为null
我正在scala中搜索一种可能性,即调用函数并获得一个Scala Try/Option为null,scala,Scala,我正在scala中搜索一种可能性,即调用函数并获得一个选项作为结果,如果调用该方法时引发异常或该方法返回null,则结果为“无”。否则,该选项应具有结果的值 我知道第一部分可以使用Try,但我不知道如何处理第二部分: val result = Try(myFunction).toOption() 如果该方法现在返回null(因为它不是scala函数而是Java函数),结果是Some(null),而不是None,正如我所知,scala标准库中只有一个方法可以将null转换为None-选项。应用(
选项
作为结果,如果调用该方法时引发异常或该方法返回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(选项())好
这可以包装起来,这样我就不用写那么多东西了吗?