Pregunta

Si tengo algo así como un List[Option[A]] y quiero convertir esto en un List[A], la forma estándar es usar 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)

Ahora o => o es sólo una función de identidad. Yo hubiera pensado que habría alguna manera de hacerlo:

l.flatMap(Identity) //return a List[String]

Sin embargo, no puedo conseguir esto para el trabajo ya que no puede generify un object. He intentado un par de cosas en vano; ¿alguien tiene algo como esto para el trabajo?

¿Fue útil?

Solución

Hay una identidad en Predef .

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

A para el expresion es más agradable, supongo:

for(x <- l; y <- x) yield y

Editar

I tratado de averiguar qué se necesita el parámetro de tipo (Opción [String]). El problema parece ser la conversión de tipo de Opción [T] para Iterable [T].

Si se define la función identidad como:

l.flatMap( x => Option.option2Iterable(identity(x)))

el parámetro de tipo se puede omitir.

Otros consejos

Fwiw, en Scala 2.8 que acaba de llamar flatten en él. Thomas tiene cubrieron principalmente para la Scala 2.7. Él sólo se perdió una forma alternativa de utilizar esa identidad:

l.flatMap[String](identity)

no va a funcionar con notación de operadores, sin embargo (parece notación de operadores no acepta parámetros de tipo, que es bueno saber).

Puede también flatten llamada en Scala 2.7 (en una List, por lo menos), pero no será capaz de hacer cualquier cosa sin un tipo. Sin embargo, esta obra:

l.flatten[String]

Sólo podía dar el tipo inferencer un poco de ayuda:

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top