Я просмотрел исходный код и нашел разумное руководство, которое не нашел через Google. https://kotlinlang.org/docs/reference/coroutines/flow.html#flattening -flows
В руководстве объясняются различия, но мне все еще было немного непонятно, поэтому я переписал его своими словами здесь.
Основы c разница между этими тремя определяется тем, как внутренний и внешний поток реагируют на новые выбросы из любого потока. Итак, для данного кода:
val outerFlow: Flow<>
val flatMappedFlow = outerflow
.flatMapXXXXX { innerFlow(it) }
.collect { processFlatMapResult(it) }
FlatMapConcat
Этот оператор является последовательным и парным. Как только outerFlow испускается один раз, innerFlow должен испустить один раз, прежде чем будет собран окончательный результат. Когда один из потоков генерирует N-й раз, другой поток должен сгенерировать N-й раз, прежде чем будет собран N-й flatMapResult .
FlatMapMerge
Этот оператор имеет наименьшие ограничения на выбросы, но может привести к слишком большому количеству выбросов. Каждый раз, когда outerFlow испускает значение, каждое из выбросов innerFlow преобразуется из этого значения в окончательный flatMapResult для сбора. Окончательный счет выбросов - это умножение выбросов innerFlow и outerFlow.
FlatMapLatest
Этот оператор заботится только о последних полученных результатах и не обрабатывает старые выбросы. Каждый раз, когда outerFlow испускает значение, он получает flatMapped с последним значением innerFlow . Каждый раз, когда innerFlow испускает значение, оно получает flatMapped с последним значением outerFlow . Таким образом, окончательное количество выбросов представляет собой значение между нулевым и внутренним потоком, умноженным на выбросы внешнего потока.