Scala语法访问内联选项和链"OrElse"的属性?

cro*_*ies 8 scala

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

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

Tom*_*icz 13

你可以用它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 "?"
Run Code Online (Sandbox Code Playgroud)

此外,如果你有一个嵌套的Options 结构:

case class Person(name: String, age: Int, parent: Option[Person])
Run Code Online (Sandbox Code Playgroud)

您可以提取嵌套OptionflatMap:

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

或者,当包含的值不满足某些条件时,您可以使用filter()转换Some()为:NoneSome

val nameIfAdult = optionalPerson filter {_.age >= 18} map {_.name}
Run Code Online (Sandbox Code Playgroud)