假设我有一个方法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 =>;
}
答案 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)