¿Cuál es la diferencia entre las funciones map
y flatMap
de Iterable
?scala Iterable # map vs. Iterable # flatMap
Respuesta
Aquí es una explicación bastante buena:
http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
lista Usando como ejemplo: la firma
del Mapa es:
map [B](f : (A) => B) : List[B]
y flatMap de es
flatMap [B](f : (A) => Iterable[B]) : List[B]
Así que flatMap toma un tipo [A] y devuelve un tipo iterable [B] y el mapa toma un tipo [A] y devuelve un tipo [B]
Esto también le dará una idea de que flatmap se "aplanará" liza.
val l = List(List(1,2,3), List(2,3,4))
println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))
println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)
De scaladoc:
- mapa
Devuelve el iterable resultante de la aplicación de la función dada f a cada elemento de este iterable.
- flatMap
aplica la función dada f a cada elemento de esta iterable, entonces concatena los resultados.
Estoy buscando un poco más de análisis/explicación. –
OK, así que cambie su pregunta para ser más específico. Di lo que ya sabes y lo que necesitas aclarar. – skaffman
Me gustó tu comentario snippy mejor. –
vistazo aquí: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
"Buscar flatMap" - hay una muy buena explicación de allí. (Básicamente es una combinación de "aplanar" y "mapa" - características de otros idiomas).
Lo anterior es cierto, pero hay una cosa más que es muy práctico: flatMap
convierte en un List[Option[A]]
List[A]
, con cualquier Option
que profundiza hasta llegar a None
, eliminado. Este es un avance conceptual clave para ir más allá del uso de null
.
Aw, ese es otro buen truco con Option Nunca pensé en eso. Acabo de tener un método para devolver una lista de 1 o más cosas, nunca vi el método 'Option.toList': Lista (Algunos (" foo "), Ninguno, Algunos (" barra ")) .flatMap (_.toList) –
O tal vez incluso mejor, use 'Option.toIterator' con el método de Tristan para que no itere sobre toda la lista hasta que sea necesario. – jkschneider
lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words
Esto se puede ver mejor en de comprensiones:
for {line <- lines
word <- line split "\\W+"}
yield word.length
esto se traduce en:
lines.flatMap(line => line.split("\\W+").map(word => word.length))
Cada repetidor interior para que se traducirá en una "flatMap", excepto el último uno, que se traduce en un "mapa".De esta forma, en lugar de devolver colecciones anidadas (una lista de una matriz de un búfer de bla, bla, bla), devuelve una colección plana. Una colección formada por los elementos que se ceden - una lista de enteros, en este caso.
- 1. Scala Iterable Memory Leaks
- 2. Combinación de la opción Scala [Iterable [_]]
- 3. ¿Cómo puedo convertir un Iterable de Java a un Iterable de Scala?
- 4. Scala: Agrupe un Iterable en un Iterable de Iterables por un predicado
- 5. Implementando la interfaz Iterable
- 6. Suma Iterable en Java?
- 7. Python iterable Cola
- 8. Colección de Iterable
- 9. En Scala Akka futuros, ¿cuál es la diferencia entre map y flatMap?
- 10. nuevo código {} Iterable de Scala 2.7.7 a 2.8
- 11. scala conversión implícita o explícita de iterador a iterable
- 12. Semántica de Scala Traversable, Iterable, Sequence, Stream y View?
- 13. Aplanamiento de un Iterable <Iterable<T>> en Guava
- 14. Retorno Iterable con Mock Python
- 15. TypeError: objeto 'float' no iterable
- 16. Convertir Java Array a Iterable
- 17. numpy.loadtxt da "no iterable" error
- 18. ¿Cuál es la relación entre Iterable e Iterator?
- 19. ¿Es Pythonic que una función devuelva un iterable o no iterable dependiendo de su entrada?
- 20. python hacer que la clase sea iterable al devolver incrustado iterable
- 21. ¿Cómo puedo implementar la interfaz Iterable?
- 22. Django Novato ManyRelated Manager no Iterable Pregunta
- 23. ¿Cómo puedo hacer una clase iterable?
- 24. TypeError: objeto 'RelatedManager' no se Iterable
- 25. ¿el objeto int no es iterable?
- 26. Python: Int no es un error iterable
- 27. Terminología: Python y Numpy - `` iterable` frente array_like`
- 28. Documentación de Python: ¿iterable muchas veces?
- 29. El objeto 'RelatedManager' no es iterable Django
- 30. Manera pitónica de copiar un objeto iterable
Es interesante notar que 'l flatMap {x => x}' es * precisamente * equivalente a 'l.flatten' de acuerdo con los axiomas monádicos. FlatMap es el equivalente de Scala de la operación monadic 'bind' (>> = en Haskell). Encuentro que es más útil en mónadas que no sean colecciones, como Option. Cuando se combina con las colecciones, es más útil para implementar "bucles de mapa anidados" y devolver una colección como resultado. –
Bien dicho. El encadenamiento de opciones es mucho mejor para trabajar que un conjunto de sentencias como if (x! = Null y x.foo! = Null). http://blog.lostlake.org/index.php?/archives/50-The-Scala-Option-class-and-how-lift-uses-it.html discute esto en detalle – agilefall
println (l.flatMap (x => x)) esto ya no funciona y se necesita usar flatMap así: http://aperiodic.net/phil/scala/s-99/p07.scala –