Есть ли в Scala предопределенная функция x, которая объединяет 2 параметра, чтобы
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
Есть ли в Scala предопределенная функция x, которая объединяет 2 параметра, чтобы
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
Да, это метод 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)
Это не сложно сделать своими руками:
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)
(a ++ b).headOption
.
- person Erik Kaplun; 13.02.2014
В комментариях к вопросу вы упоминаете, что у вас не может быть 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)
Option[T]
, или будет?
- person Erik Kaplun; 13.02.2014
Some
случая не могут произойти, то было бы лучше закодировать это в системе типов. Если имеется 2 значения Option[T]
, то следует предположить, что они оба могут быть Some
. Ответ orElse
, который дал Бен, отдает приоритет одному варианту над другим, что может быть правильным. Однако использование Option[Either[T,T]]
устраняет необходимость принимать это решение.
- person Kristian Domagala; 13.02.2014
Some(a)
иSome(b)
? - person Alex DiCarlo   schedule 13.01.2013