Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining 2 Options into 1

Is there a predefined function x in Scala that combine 2 Options so that

Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
like image 539
Jens Schauder Avatar asked Jan 13 '13 16:01

Jens Schauder


3 Answers

Yes, this is the orElse method. It chooses the first defined value, or None if neither is defined.

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)
like image 61
Ben James Avatar answered Nov 04 '22 13:11

Ben James


It's not hard to do it by hand:

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)
like image 32
om-nom-nom Avatar answered Nov 04 '22 11:11

om-nom-nom


In the question comments, you mention you can't have Some(a) and Some(b), so what you really have is Option[Either[Int,Int]]. In that case, you can use x.map(_.merge) to get back to Option[Int], eg

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)
like image 3
Kristian Domagala Avatar answered Nov 04 '22 11:11

Kristian Domagala