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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top