You can use map() to achieve this. This becomes apparent when you start thinking of Option[T] as a container of type T , which can contain 0 or 1 elements:
case class Person(name: String, age: Int) val optionalPerson = Some(Person("John", 29)) val name = optionalPerson map {_.name} getOrElse "?"
Also, if you have a nested Option s structure:
case class Person(name: String, age: Int, parent: Option[Person])
you can extract the nested Option using flatMap :
val optionalPerson = Some(Person("John", 29, Some(Person("Mary", 55, None)))) val parentName = optionalPerson flatMap {_.parent} map {_.name} getOrElse "Unknown parent name"
Or you can use filter() to turn Some() to None when the value enclosed in Some does not satisfy some criteria:
val nameIfAdult = optionalPerson filter {_.age >= 18} map {_.name}
Tomasz Nurkiewicz
source share