Объединение 2 опций в 1

Есть ли предопределенная функция x в Scala, которая объединяет 2 параметра так, чтобы

Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None

Ответы

Ответ 1

Да, это метод orElse. Он выбирает первое определенное значение или None, если не определено.

scala> Some(1) orElse None
res0: Option[Int] = Some(1)

scala> None orElse Some(1)
res1: Option[Int] = Some(1)

scala> None orElse None
res2: Option[Nothing] = None

scala> Some(1) orElse Some(2)
res3: Option[Int] = Some(1)

Ответ 2

Нетрудно сделать это вручную:

scala> val a = Some(1)
a: Some[Int] = Some(1)

scala> val b = Some(2)
b: Some[Int] = Some(2)

scala> Seq(a,b).flatten.headOption
res0: Option[Int] = Some(1)

Ответ 3

В комментариях к вопросу вы упомянули, что у вас не может быть Some(a) и Some(b), поэтому у вас действительно есть Option[Either[Int,Int]]. В этом случае вы можете использовать x.map(_.merge), чтобы вернуться к Option[Int], например

scala> val x:Option[Either[Int,Int]] = Some(Left(2))
x: Option[Either[Int,Int]] = Some(Left(2))

scala> x.map(_.merge)
res0: Option[Int] = Some(2)