假设我有一种方法 session.get(str: String): String 但是您不知道它会返回您的字符串还是无效,因为它来自Java。

是否有一种更简单的方法可以在Scala而不是 session.get("foo") == null ?也许有些魔术像 ToOption(session.get("foo")) 然后我可以像Scala一样对待

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}
有帮助吗?

解决方案

Option 伴侣对象的 apply 方法是从无效参考的转换函数:

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

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

其他提示

Option 对象有一个 apply做到这一点的方法:

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

请注意,使用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

这是一个非常古老的话题,但一个很好!

的确,转换尝试选择的任何不远外结果都会导致一些...

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

...因为尝试不是关于无效检查,而只是一种在功能上处理异常的方法。

使用尝试捕获异常并将其转换为选项以方便起见,只会显示出异常时不会显示出来。

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

您想保留尝试中的价值。那可能是无效的。

但是,标准lib有时确实令人困惑。

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

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

这种行为有点不一致,但它反映了尝试和选项的意图使用。

您可以尝试从可能会引发异常的表达中获得任何东西,并且您不在乎例外本身。

可能会出现的价值很可能是无效的。如果Toottion一无所获, 您无法区分异常和无效, ,那不是很漂亮!

独立,您使用选项将某物的存在封装。因此,在这种情况下,有些(零)不是,这是有道理的,因为在这种情况下为NULL表示没有某物的缺乏。这里没有歧义。

重要的是要指出,无论如何,参考透明度都不会破坏,因为。 不是 与option()相同

如果您真的需要执行 两个都 例外安全 无效安全和您的代码 真的不需要在零和例外之间有所不同, ,您只需要结合两个范式!因为那是你想要的,对吗?

您可以以一种方式做到这一点...

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top