Saltar al contenido

¿Cuál es la diferencia entre concatMap y flatMap en RxJava?

Comprende el código bien previamente a usarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en los comentarios.

Solución:

Como escribió, las dos funciones son muy similares y la diferencia sutil es cómo se crea la salida (después de aplicar la función de mapeo).

El mapa plano usa el operador de combinación mientras que concatMap usa el operador concat.

Como puede ver, la secuencia de salida de concatMap está ordenada: todos los elementos emitidos por el primer Observable se emiten antes que cualquiera de los elementos emitidos por el segundo Observable,
mientras que la secuencia de salida de flatMap está fusionada, los elementos emitidos por el Observable fusionado pueden aparecer en cualquier orden, independientemente de la fuente del Observable de la que provengan.

Aunque las respuestas aquí son buenas, no fue fácil detectar la diferencia sin un ejemplo. Entonces, creé un ejemplo simple para esto:

@Test
public void flatMapVsConcatMap() throws Exception 
    System.out.println("******** Using flatMap() *********");
    Observable.range(1, 15)
            .flatMap(item -> Observable.just(item).delay(1, TimeUnit.MILLISECONDS))
            .subscribe(x -> System.out.print(x + " "));

    Thread.sleep(100);

    System.out.println("n******** Using concatMap() *********");
    Observable.range(1, 15)
            .concatMap(item -> Observable.just(item).delay(1, TimeUnit.MILLISECONDS))
            .subscribe(x -> System.out.print(x + " "));

    Thread.sleep(100);

******** Uso de flatMap() *********

1 2 3 4 5 6 7 9 8 11 13 15 10 12 14

******** Uso de concatMap() *********

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Como se puede ver en la salida, los resultados para flatMap están desordenados mientras que para concatMap ellos son.

Una diferencia muy importante: la concatMap espera a que el observable emitido actual se complete y flatMap no. flatMap trata de iniciar tantos como sea posible. Dicho simplemente: no puedes concatenar algo infinito. Solo asegúrese de que los observables que emite en concatMap puede completarde lo contrario, todo el flujo se atascará esperando que se complete el observable actual para concatenar el siguiente.

¡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 *