有时我想返回一个包含在选项中的对象的属性值,但我不能用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 "?"
此外,如果您有Option
s 的嵌套结构:
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()
使用它:None
Some
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)