在 Scala 中从 Option[..] 获取 java.io.Serializable
getting a java.io.Serializable from Option[..] in Scala
(几周前刚开始使用 Scala,请多多包涵)
Reading/trying出这篇小文章,运行有些惊喜
http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html
定义案例后class 描述的用户:
case class User(
id: Int,
firstName: String,
lastName: String,
age: Int,
gender: Option[String])
object UserRepository {
private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
2 -> User(2, "Johanna", "Doe", 30, None))
def findById(id: Int): Option[User] = users.get(id)
def findAll = users.values
}
,这是我观察到的结果:
> scala> UserRepository.findById(1)
> res34: Option[User] = Some(User(1,John,Doe,32,Some(male)))
>
> scala> UserRepository.findById(1).get
> res35: User = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(1).getOrElse("N/A")
> res36: java.io.Serializable = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(3).getOrElse("N/A")
> res37: java.io.Serializable = N/A
前两个是我所期望的,但后两个不是;现有和非现有用户的情况。为什么java.io.Serializable,突然之间?
要了解这一点,您必须了解什么是 getOrElse
final def getOrElse[B >: A](default: => B): B
getOrElse
是在 Option
上定义的。 Option
可以是 Some(value)
或 None
.
getOrElse
returns default
当 option
是 none
val map = Map(1 -> 2)
map.get(1)
returns option
scala> Some(1).getOrElse(2)
res3: Int = 1
scala> Some(1).getOrElse("Hello")
res4: Any = 1
scala> case class User(name: String)
defined class User
scala> (None: Option[User]).getOrElse("a")
res12: java.io.Serializable = a
scala> (None: Option[User]).getOrElse(1)
res7: Any = 1
进入正题
Some(a).getOrElse(b)
如果 a
和 b
类型相同,则结果类型将为 a
类型或 b
类型
如果 a
和 b
是相同类型的 not
那么结果类型将是最接近的普通超类型,在你的情况下是 java.io.Serializable
。
注意
1) User
的最接近公共超类型并且 String 是可序列化的
2) User
和 Int 最接近的公共超类型是 Any
(几周前刚开始使用 Scala,请多多包涵)
Reading/trying出这篇小文章,运行有些惊喜
http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html
定义案例后class 描述的用户:
case class User(
id: Int,
firstName: String,
lastName: String,
age: Int,
gender: Option[String])
object UserRepository {
private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
2 -> User(2, "Johanna", "Doe", 30, None))
def findById(id: Int): Option[User] = users.get(id)
def findAll = users.values
}
,这是我观察到的结果:
> scala> UserRepository.findById(1)
> res34: Option[User] = Some(User(1,John,Doe,32,Some(male)))
>
> scala> UserRepository.findById(1).get
> res35: User = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(1).getOrElse("N/A")
> res36: java.io.Serializable = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(3).getOrElse("N/A")
> res37: java.io.Serializable = N/A
前两个是我所期望的,但后两个不是;现有和非现有用户的情况。为什么java.io.Serializable,突然之间?
要了解这一点,您必须了解什么是 getOrElse
final def getOrElse[B >: A](default: => B): B
getOrElse
是在 Option
上定义的。 Option
可以是 Some(value)
或 None
.
getOrElse
returns default
当 option
是 none
val map = Map(1 -> 2)
map.get(1)
returns option
scala> Some(1).getOrElse(2)
res3: Int = 1
scala> Some(1).getOrElse("Hello")
res4: Any = 1
scala> case class User(name: String)
defined class User
scala> (None: Option[User]).getOrElse("a")
res12: java.io.Serializable = a
scala> (None: Option[User]).getOrElse(1)
res7: Any = 1
进入正题
Some(a).getOrElse(b)
如果 a
和 b
类型相同,则结果类型将为 a
类型或 b
类型
如果 a
和 b
是相同类型的 not
那么结果类型将是最接近的普通超类型,在你的情况下是 java.io.Serializable
。
注意
1) User
的最接近公共超类型并且 String 是可序列化的
2) User
和 Int 最接近的公共超类型是 Any