9

有时我想返回一个包含在选项中的对象的属性值,但我不能用getValue.orElse(otherValue).

例如,我正在内联映射属性,我想使用类似object.get.property.orElse(""). 但是前面没有编译。如何访问该属性并仍然保持类似选项的语法?

4

2 回答 2

15

您可以使用map()来实现这一点。一旦你开始考虑Option[T]像一个T可以容纳 0 或 1 个元素的容器类型,它就会变得很明显:

case class Person(name: String, age: Int)

val optionalPerson = Some(Person("John", 29))
val name = optionalPerson map {_.name} getOrElse "?"

此外,如果您有Options 的嵌套结构:

case class Person(name: String, age: Int, parent: Option[Person])

Option你可以提取嵌套flatMap

val optionalPerson = Some(Person("John", 29, Some(Person("Mary", 55, None))))
val parentName = optionalPerson flatMap {_.parent} map {_.name} getOrElse "Unknown parent name"  //Mary

或者,您可以filter()在包装的值不满足某些条件时Some()使用它:NoneSome

val nameIfAdult = optionalPerson filter {_.age >= 18} map {_.name}
于 2012-06-26T17:09:52.147 回答
4

用于map()维护类似选项的模式。

例如,您需要获取对象的name属性field。但如果 field 实际上是None,您可以返回一个空白字符串。像这样:

field.map(_.name).getOrElse("")

并在更大的范围内使用它:

implicit def castDraftModel(drafts:List[Tuple2[models.ReportInstance,Option[models.Report]]]) = drafts.map{
    (field) => 
      List(Field(
        field._1.id, 
        field._1.teamId, 
        field._2.map(_.name).getOrElse(""), 
        field._1.lastModifiedRelative, 
        field._2.map(_.id).getOrElse(0L), 
        field._2.map(_.reportType).getOrElse(""), 
        field._1.referenceId, 
        field._1.referenceName( draft._2.map(_.reportType).getOrElse("") ) ))
  }.flatten.sortBy(_.id)
于 2012-06-26T17:06:52.457 回答