根据包含对象的选项返回成员的选项

时间:2014-02-20 09:09:14

标签: scala

假设我有以下内容:

case class Person(val name: String) {}

def personName(person: Option[Person]): Option[String] = {
  // if person is a Some(Person) Some(person.get.name) else None
}

我的观点是,如何轻松(在一行中)返回该人姓名的选项,具体取决于该人是否为“某人”或“无”?

我可以通过模式匹配轻松完成此操作,就像这样

def personName(person: Option[Person]): Option[String] = {
  person match {
    case Some(p) => Some(p.name)
    case None => None
  }
}

我可以轻松地为此编写一个通用函数,就像这个

def optionalAttribute[T, AT](obj: Option[T], attribute: => AT): Option[AT] = {
  obj match {
    case Some(t) => Some(attribute)
    case None => None
  }
}

但是了解Scala,必须有一种更容易(一线)的方法来实现这一点。

我在俯瞰什么?

2 个答案:

答案 0 :(得分:4)

def personName(person: Option[Person]): Option[String] = person.map(_.name)

答案 1 :(得分:0)

事实上,我忽视了一些简单的事情。科莱格指出了这一点。

for (p <- person) yield p.name