Saltar al contenido

¿Cuál es la diferencia entre los métodos map() y flatMap() en Java 8?

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 Functionque 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.flatMapcomo 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *