有Scala中的一個預定義的函數x,結合2個選項使得結合2個選項成1
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
有Scala中的一個預定義的函數x,結合2個選項使得結合2個選項成1
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'。 –
在問題的評論,你提到你不能有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]'返回功能,或者它會嗎? –
我的觀點更多的是*如果*兩個'Some''' *不能*發生,那麼在類型系統中編碼會更好。如果有2個'Option [T]'值,那麼必須假定它們都可以是'Some'。 Ben給出的「orElse」答案優先於另一個選項,這可能是有效的。使用Option [雖然[T,T]]儘管不需要做出該決定。 –
,當你有一些'(一)'和'部分(B)'關於什麼的? –
這種情況不會發生在我正在做的事情上,所以我不在乎結果是什麼。 –