flatMap() разделяет rx-стрим на несколько промежуточных стримов, назовем их [A, B, C], и затем соединяет результат в один стрим. Элементы промежуточных стримов передаются напрямую в конечный стрим без гарантии сохранения порядка, в котором созданы A, B и C. Конечный результат может быть таким: [C1, A1, A2, B1, C2, A3, B2, B3, C3].

concatMap() работает похожим на flatMap() образом, но сохраняет порядок промежуточных стримов. Результат будет: [A1, A2, A3, B1, B2, B3, C1, C2, C3].

switchMap() похож на flatMap() и также как concatMap() сохраняет порядок. Но при использовании switchMap() каждый предыдущий промежуточный стрим останавливается в тот момент, когда стартует следующий. Результат может выглядеть так: [A1, A2, B1 C1, C2, C3].

Подробнее