何时使用 Option#orNull
When to use Option#orNull
据我所知,我们应该避免在 Scala 中使用 null
。如果某些字段在逻辑上没有 "no-value" 那么我们不应该使用 Option
以避免过度使用 Option
s.
所以让我们看看代码。
我有 class
case class User (name: String)
并且我 100% 确定 name
字段不能是 null
,因此我只使用 String
而不是 Option[String]
。
问题是一些标准的 Scala 方法 return 对我来说 Option
s。 (在我的例子中 IterableLike#find
方法 returns 选项)
所以问题是当我将 name
包装到 Option
时如何创建 User
实例?
要清楚一点,这是代码:
val userName: Option[String] = myList.find(...)
val user = User(userName.get) // or may be I should use userName.orNull ? or throw exception?
听说Option.get
不是优雅的解决方案。 orNull
方法几乎与get
相同。
您想将 Option[String]
映射到 Option[User]
:
val userName: Option[String] = myList.find(...)
val user: Option[User] = userName.map(n => User(n))
orNull
主要用于 Java 互操作性。在许多 Java 库中,null
作为标记值的使用很普遍,orNull
用作一小块语法糖。本质上它只是 myOption.getOrElse(null)
但函数名称允许稍微更简洁的代码。
在纯 Scala 项目中使用 orNull
至少可以说是奇怪的。
据我所知,我们应该避免在 Scala 中使用 null
。如果某些字段在逻辑上没有 "no-value" 那么我们不应该使用 Option
以避免过度使用 Option
s.
所以让我们看看代码。 我有 class
case class User (name: String)
并且我 100% 确定 name
字段不能是 null
,因此我只使用 String
而不是 Option[String]
。
问题是一些标准的 Scala 方法 return 对我来说 Option
s。 (在我的例子中 IterableLike#find
方法 returns 选项)
所以问题是当我将 name
包装到 Option
时如何创建 User
实例?
要清楚一点,这是代码:
val userName: Option[String] = myList.find(...)
val user = User(userName.get) // or may be I should use userName.orNull ? or throw exception?
听说Option.get
不是优雅的解决方案。 orNull
方法几乎与get
相同。
您想将 Option[String]
映射到 Option[User]
:
val userName: Option[String] = myList.find(...)
val user: Option[User] = userName.map(n => User(n))
orNull
主要用于 Java 互操作性。在许多 Java 库中,null
作为标记值的使用很普遍,orNull
用作一小块语法糖。本质上它只是 myOption.getOrElse(null)
但函数名称允许稍微更简洁的代码。
在纯 Scala 项目中使用 orNull
至少可以说是奇怪的。