有时我想返回一个包含在选项中的对象的属性值,但我不能用getValue.orElse(otherValue).
例如,我正在内联映射属性,我想使用类似object.get.property.orElse(""). 但是前面没有编译。如何访问该属性并仍然保持类似选项的语法?
有时我想返回一个包含在选项中的对象的属性值,但我不能用getValue.orElse(otherValue).
例如,我正在内联映射属性,我想使用类似object.get.property.orElse(""). 但是前面没有编译。如何访问该属性并仍然保持类似选项的语法?
您可以使用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}
用于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)