В чем разница между zip и combine в Flow

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

Ответ

zip и combine — операторы для объединения нескольких Flow, но работают они по-разному:

  • zip — ждет, пока каждый из объединяемых Flow испустит новое значение, затем применяет функцию-преобразователь. Если один из Flow испустил значение, а другой нет — ждет. Порядок важен.
flow1.zip(flow2) { a, b -> "$a and $b" }
  • combine — при каждом новом значении любого из Flow пересчитывает результат, используя последние значения из всех Flow. Не ждет обновлений всех источников.
flow1.combine(flow2) { a, b -> "$a and $b" }

Пример:
Если flow1 испустил 1, а flow2 еще ничего не испустил:

  • zip — не сработает.
  • combine — сработает, когда flow1 обновится (если flow2 уже имел значение).

Вывод:
zip — строгий, combine — реактивный.