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
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
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)
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)
Oder nur '(a ++ b) .headOption'. –
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)
Das ist ein sehr guter Punkt. Es ist verdächtig, einen Typ zu benutzen, der so offensichtlich Einwohner hat, die "nicht passieren können" –
das funktioniert vielleicht nicht so gut, wenn er zwei 'Option [T]' zurückgebende Funktionen hat, oder? –
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. –
Was verwenden, wenn Sie 'Einige (a)' und 'Einige (b)'? –
Dieser Fall kann nicht passieren, was ich mache, also ist mir egal, was das Ergebnis ist. –