访问选项类型成员

时间:2017-01-17 23:14:48

标签: scala

说我有:

case class User(
  id: Int,
  firstName: String,
  lastName: String,
  age: Int,
  gender: Option[String])

要声明选项值,我输入:

val x:Option[User] = Some(User(1,"x","x",13,Some("ss")))

如何访问x的成员,例如

x.age

我在上面的声明中得到以下错误

error: value age is not a member of Option[User]
   x.age

这是远程可能吗

5 个答案:

答案 0 :(得分:2)

如此多的答案......为了完整性,我认为使用选项(以及任何Monads)的一种很酷的方式是使用for-understanding。

for( user <- x ) yield user.age

它也适用于任意嵌套选项,例如:

case class Address(street: String, number: Option[Int])
case class User(name: String, addr: Option[Address]) 

val u = Some(User("foo", Some(Address("bar", Some(2)))))

for( user <- u; addr <- user.addr; n <- addr.number) yield n 

答案 1 :(得分:1)

用于从monad检索数据的模式匹配的另一种方法是使用[

flatMap

我只是意识到这并没有真正回答你的问题,但除非有不同的意见,否则我仍会把它留在这里作为替代选择。

虽然保留上述答案,但我认为从选项获取值的更惯用的方法是x.flatMap(user => Option(user.age)) // res128: Option[Int] = Some(13)

getOrElse

x.map(_.age).getOrElse(0) // res140: Int = 13

get

答案 2 :(得分:1)

研究Scaladoc page for Option。有许多方法返回具体类型(即非monadic)。示例包括foldgetOrElseheadmaxproductsum等等。

但是,值得注意的是,大多数这些在运行时都不安全(如果在None上调用则会抛出错误)。最好使用在None上调用时提供默认值的方法。 (foldgetOrElse很好。)

答案 3 :(得分:0)

您可以使用模式匹配

进行访问
val x: Option[User] = Some(User(1,"x","x",13,Some("ss"))
    x match {
      case Some(user) => user.age
      case None => 0
    }

http://www.scala-lang.org/api/2.12.x/scala/Option.html

答案 4 :(得分:0)

您正在寻找的是模式匹配。它可以让您测试x的类型。 你只需要写:

x match{
    case None => /* Your code if it's None */
    case Some(user) => /* Here user has type User, so you can call its methods */
}