2013-01-13 14 views
15

Gibt es eine vordefinierte Funktion x in Scala, die 2 Optionen kombinieren, so dassKombination 2 Optionen in 1

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

Was verwenden, wenn Sie 'Einige (a)' und 'Einige (b)'? –

+0

Dieser Fall kann nicht passieren, was ich mache, also ist mir egal, was das Ergebnis ist. –

Antwort

39

Ja, das ist die orElse Methode. Es wählt den ersten definierten Wert oder None, wenn keine definiert ist.

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) 
3

Es ist nicht schwer, es von Hand zu tun:

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

Oder nur '(a ++ b) .headOption'. –

3

In der Frage Kommentare, die Sie erwähnen Sie nicht Some(a) und Some(b) haben kann, so was Sie wirklich haben Option[Either[Int,Int]] ist. In diesem Fall können Sie x.map(_.merge), um wieder zu Option[Int], zB

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) 
+1

Das ist ein sehr guter Punkt. Es ist verdächtig, einen Typ zu benutzen, der so offensichtlich Einwohner hat, die "nicht passieren können" –

+0

das funktioniert vielleicht nicht so gut, wenn er zwei 'Option [T]' zurückgebende Funktionen hat, oder? –

+2

Mein Punkt war mehr als * wenn * die zwei 'Einige' Fälle * nicht passieren können, dann wäre es besser, das im Typsystem zu kodieren. Wenn es zwei 'Option [T]' -Werte gibt, dann muss angenommen werden, dass beide "Some" sein können. Die "oderElse" Antwort, die Ben gab, priorisiert eine Option gegenüber der anderen, die gültig sein kann. Die Verwendung von 'Option [Entweder [T, T]]' beseitigt jedoch die Notwendigkeit, diese Entscheidung zu treffen. –