C'è una funzione scala identità?
-
22-09-2019 - |
Domanda
Se ho qualcosa di simile a un List[Option[A]]
e voglio convertire questo in un List[A]
, il modo standard è quello di utilizzare flatMap
:
scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))
scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)
Ora o => o
è solo una funzione identità. Avrei pensato che ci sarebbe un modo per farlo:
l.flatMap(Identity) //return a List[String]
Tuttavia, non posso ottenere questo a lavorare come non si può generify un object
. Ho provato un paio di cose senza alcun risultato; Chiunque ha ottenuto qualcosa di simile al lavoro?
Soluzione
C'è un in Predef .
l flatMap identity[Option[String]]
> List[String] = List(Hello, World)
A per expresion è più bello, suppongo:
for(x <- l; y <- x) yield y
Modifica
Ho cercato di capire il motivo per cui è necessario il parametro type (Opzione [String]). Il problema sembra essere la conversione di tipo da Opzione [T] per Iterable [T].
Se si definisce la funzione identità come:
l.flatMap( x => Option.option2Iterable(identity(x)))
il parametro tipo può essere omesso.
Altri suggerimenti
FWIW, su Scala 2.8 basta chiamare flatten
su di esso. Thomas è per lo più coperto per Scala 2.7. Gli mancava solo un modo alternativo di usare tale identità:
l.flatMap[String](identity)
Non funzionerà con la notazione dell'operatore, però (sembra la notazione operatore non accetta parametri di tipo, che è bene sapere).
È possibile anche chiamata flatten
su Scala 2.7 (su un List
, almeno), ma non sarà in grado di fare nulla senza un tipo. Tuttavia, questo funziona:
l.flatten[String]
Si può solo dare il tipo inferencer un piccolo aiuto:
scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))
scala> l.flatten[String]
res0: List[String] = List(Hello, World)