В чем разница между flatMap и concatMap

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

Ответ

flatMap и concatMap — операторы из RxJava, преобразующие элементы в потоки (Observable/Flowable).

Ключевое отличие: порядок обработки элементов.

  • flatMap — параллельно обрабатывает элементы, порядок результирующих элементов не гарантируется.
    Observable.range(1, 3)
        .flatMap { i -> Observable.just(i, i * 10).delay(100, TimeUnit.MILLISECONDS) }
    // Может выдать: 1, 2, 10, 3, 20, 30 (порядок не строгий)
  • concatMap — сохраняет исходный порядок, обрабатывает элементы последовательно.
    Observable.range(1, 3)
        .concatMap { i -> Observable.just(i, i * 10).delay(100, TimeUnit.MILLISECONDS) }
    // Гарантированно: 1, 10, 2, 20, 3, 30

Выбор:

  • flatMap — когда важен результат, а не порядок (например, сетевые запросы).
  • concatMap — когда порядок критичен (например, операции с БД).