在java中包装零回收方法,并在scala中使用选项?
-
11-10-2019 - |
题
假设我有一种方法 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)