Hacemos una revisión completa cada reseña de nuestra web con la meta de enseñarte siempre información con la mayor veracidad y actual.
Solución:
Ambas cosas map
y flatMap
se puede aplicar a un Stream
y ambos devuelven un Stream
. La diferencia es que el map
La operación produce un valor de salida para cada valor de entrada, mientras que la flatMap
La operación produce un número arbitrario (cero o más) valores para cada valor de entrada.
Esto se refleja en los argumentos de cada operación.
los map
la operación toma un Function
que se llama para cada valor en el flujo de entrada y produce un valor de resultado, que se envía al flujo de salida.
los flatMap
La operación toma una función que conceptualmente quiere consumir un valor y producir un número arbitrario de valores. Sin embargo, en Java, es engorroso que un método devuelva un número arbitrario de valores, ya que los métodos solo pueden devolver cero o un valor. Uno podría imaginar una API donde la función de mapeador para flatMap
toma un valor y devuelve un array o un List
de valores, que luego se envían a la salida. Dado que esta es la biblioteca de flujos, una forma particularmente adecuada de representar un número arbitrario de valores devueltos es que la propia función del mapeador devuelva un flujo. Los valores del flujo devuelto por el mapeador se drenan del flujo y se pasan al flujo de salida. Los “grupos” de valores devueltos por cada llamada a la función del mapeador no se distinguen en absoluto en el flujo de salida, por lo que se dice que la salida se ha “aplanado”.
El uso típico es para la función de mapeador de flatMap
regresar Stream.empty()
si quiere enviar valores cero, o algo así Stream.of(a, b, c)
si quiere devolver varios valores. Pero, por supuesto, se puede devolver cualquier flujo.
Stream.flatMap
como se puede adivinar por su nombre, es la combinación de un map
y un flat
operación. Eso significa que primero aplica una función a sus elementos y luego la aplana. Stream.map
solo aplica una función a la transmisión sin aplanar la transmisión.
para entender lo que aplastamiento consiste en una corriente, considere una estructura como [ [1,2,3],[4,5,6],[7,8,9] ]
que tiene “dos niveles”. Aplanar esto significa transformarlo en una estructura de “un nivel”: [ 1,2,3,4,5,6,7,8,9 ]
.
Me gustaría dar 2 ejemplos para obtener una más punto de vista práctico:
Primer ejemplo haciendo uso de map
:
@Test
public void convertStringToUpperCaseStreams()
List collected = Stream.of("a", "b", "hello") // Stream of String
.map(String::toUpperCase) // Returns a stream consisting of the results of applying the given function to the elements of this stream.
.collect(Collectors.toList());
assertEquals(asList("A", "B", "HELLO"), collected);
Nada especial en el primer ejemplo, un Function
se aplica para devolver el String
en mayúsculas
Segundo ejemplo haciendo uso de flatMap
:
@Test
public void testflatMap() throws Exception
List together = Stream.of(asList(1, 2), asList(3, 4)) // Stream of List
.flatMap(List::stream)
.map(integer -> integer + 1)
.collect(Collectors.toList());
assertEquals(asList(2, 3, 4, 5), together);
En el segundo ejemplo, se pasa un flujo de lista. ¡NO es una secuencia de enteros!
Si se debe usar una función de transformación (a través del mapa), primero se debe aplanar el flujo a otra cosa (un flujo de entero).
Si flatMap
se elimina, se devuelve el siguiente error: El operador + no está definido para los tipos de argumento List, int.
NO es posible aplicar + 1 en un List
de enteros!
Si estás de acuerdo, tienes el poder dejar un artículo acerca de qué le añadirías a esta sección.