Futuros - mapa vs plano

He leído los documentos sobremap yflatMap y entiendo queflatMap se utiliza para una operación que acepta unFuture parámetro y devuelve otroFuture. Lo que no entiendo completamente es por qué querría hacer esto. Toma este ejemplo:

El usuario accede a mi servicio web pidiendo "hacer cosas"Descargo un archivo (que es lento)Proceso el archivo (que requiere mucha CPU)Renderizar el resultado

Entiendo que me gustaría usar un futuro para descargar el archivo, pero tengo dos opciones para volver a procesarlo:

val downloadFuture = Future { downloadFile }
val processFuture = downloadFuture map { processFile }
processFuture onSuccess { case r => renderResult(r) }

o

val downloadFuture = Future { // download the file }
val processFuture = downloadFuture flatMap { Future { processFile } }
processFuture onSuccess { case r => renderResult(r) }

Al agregar sentencias de depuración (Thread.currentThread().getId) Veo que en ambos casos descarga,process yrender ocurrir en el mismo hilo (usandoExecutionContext.Implicits.global)

UsaríaflatMap simplemente para desacoplardownloadFile yprocessFile y asegurar queprocessFile siempre corre en unFuture incluso si no fue mapeado desdedownloadFile?

Respuestas a la pregunta(3)

Su respuesta a la pregunta