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.