使用Scala中的Option包装Java中的null返回方法?

时间:2011-01-14 15:13:31

标签: java scala scala-option

假设我有一个方法session.get(str: String): String,但你不知道它是否会返回一个字符串或null,因为它来自Java。

在Scala而不是session.get("foo") == null中有更简单的方法来处理这个问题吗?也许某些魔法适用于ToOption(session.get("foo"))然后我可以像Scala那样处理它

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}

4 个答案:

答案 0 :(得分:161)

Option伴随对象的apply方法用作来自可空引用的转换函数:

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)

答案 1 :(得分:15)

Option对象的apply方法完全符合以下条件:

var myOptionalString = Option(session.get("foo"));

答案 2 :(得分:1)

请注意,使用Java对象时,它将无法按预期工作:

val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option)  // Doesn't work - zero value on conversion

val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value

答案 3 :(得分:-2)

这是一个非常古老的话题,但却是一个不错的话题!

的确,将“尝试”的任何“非例外”结果转换为“ ...”会导致

scala> Try(null).toOption
res10: Option[Null] = Some(null)

...因为尝试不是关于可空性检查,而仅仅是功能上处理异常的一种方式。

为方便起见,尝试捕获异常并将其转换为Option只会在发生异常的情况下显示None。

scala> Try(1/0).toOption
res11: Option[Int] = None

您要保留来自Try的值。可能为空。

但是,标准库有时也很令人困惑...

scala> Try(null).toOption
res12: Option[Null] = Some(null)

scala> Option(null)
res13: Option[Null] = None

此行为有点不一致,但是某种程度上反映了Try和Option的预期用法。

您使用try来获取表达式中可能引发异常的任何内容,而您并不关心异常本身。

可能出现的值很可能为空。如果toOption给出None,则您无法区分异常和null ,那不妙!

独立运行时,您可以使用Option封装某事物的存在与否。因此,在那种情况下,Some(null)为None,这是有道理的,因为在这种情况下,null表示缺少某些东西。这里没有歧义。

重要的一点是,在任何情况下,.toOption与Option()不相同

如果您确实需要强制执行两者异常安全 AND 空安全性,并且您的代码确实真的不需要区分空和异常< / em>,您只需要结合两个范例!因为好吧,这就是您想要的,对吧?

您可以用一种方法来做...

scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None

scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None

scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)

...或其他...

scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None

scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None

scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)

...或者他们中最丑陋的一个...

scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None

scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None

scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)