Зачем нужен flatMap если он не сохраняет порядок в отличие от concatMap

«Зачем нужен flatMap если он не сохраняет порядок в отличие от concatMap» — вопрос из категории Реактивное программирование, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

flatMap и concatMap оба преобразуют поток элементов, но работают по-разному:

  • flatMap – асинхронно обрабатывает элементы, объединяя их в один поток без гарантии порядка. Подходит, когда порядок не важен, а важна скорость.
  • concatMap – сохраняет порядок, обрабатывая элементы последовательно.

Пример:

flowOf(1, 2, 3)
    .flatMap { value -> 
        flow { emit(value); emit(value * 10) } 
    }
    .collect { println(it) } // Может вывести: 1, 10, 2, 20, 3, 30 (но порядок не гарантирован)

Когда использовать:

  • flatMap – для параллельных задач (например, сетевых запросов).
  • concatMap – когда важен порядок (например, последовательная обработка данных).