Ответ 1
I второй @rarry: fold
- это лучший способ справиться с этим.
Некоторые предпочитают сопоставление шаблонов, потому что это "круто" (что бы это ни значило), а иногда и легче читать.
Я стараюсь избегать использования getOrElse
, потому что это не заставляет вас использовать тот же тип для значения по умолчанию, что и тип, завернутый в ваш Option
:
def getOrElse[B >: A](default: ⇒ B): B
Итак, вы можете написать:
val v = Some(42).getOrElse("FortyTwo")
Здесь v
имеет тип Any
. Очень легко увидеть проблему с таким глупым примером, но иногда это не так очевидно и может привести к проблемам.
Пока fold
:
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
Это заставляет вас возвращать один и тот же тип для обеих ветвей.
scala> Some(42).fold("fortyTwo")(v => v)
<console>:8: error: type mismatch;
found : Int
required: String
Some(42).fold("fortyTwo")(v => v)