C'è una funzione x predefinita a Scala che si combinano 2 opzioni in modo cheLa combinazione di 2 opzioni in 1
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
C'è una funzione x predefinita a Scala che si combinano 2 opzioni in modo cheLa combinazione di 2 opzioni in 1
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
Sì, questo è il metodo orElse
. Sceglie il primo valore definito, o None
se nessuno dei due è definito.
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)
Non è difficile farlo a mano:
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)
O semplicemente '(a ++ b) .headOption'. –
Nei commenti domanda, parlare non si può avere Some(a)
e Some(b)
, in modo da quello che hai è davvero Option[Either[Int,Int]]
. In tal caso, è possibile utilizzare x.map(_.merge)
per tornare a Option[Int]
, ad esempio
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)
Questo è un ottimo punto. È sospetto che stia usando un tipo che ha ovviamente abitanti che "non può succedere" –
questo potrebbe non funzionare così bene anche se ha due funzioni di "Opzione [T]" di ritorno, o sarebbe? –
Il mio punto era che * se * i due casi '' alcuni * * non * dovessero accadere, allora sarebbe meglio codificarlo nel sistema dei tipi. Se ci sono 2 valori di "Opzione [T]", allora si deve presumere che possano essere entrambi "Alcuni". La risposta 'orElse' che Ben ha dato la priorità ad un'opzione rispetto all'altra, che può essere valida. Usando l'opzione [O [T, T]] 'rimuove anche la necessità di prendere quella decisione. –
Che dire quando si ha 'Alcuni (a)' e 'Alcuni (b)'? –
Questo caso non può accadere in quello che sto facendo, quindi non mi interessa quale sia il risultato. –