В чем разница между zip и merge

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

Ответ

zip и merge — операторы из RxJava для комбинирования потоков, но работают по-разному:

Zip
Объединяет строго попарно элементы из нескольких потоков, применяя функцию к каждой паре. Если один из потоков завершится раньше, оператор прекращает работу.

Observable.zip(
    Observable.just("A", "B"),
    Observable.just(1, 2),
    BiFunction { letter, number -> "$letter$number" }
).subscribe { println(it) } // A1, B2

Merge
Просто объединяет элементы из нескольких потоков в один, сохраняя порядок эмиссии (но без гарантии последовательности). Работает, пока есть активные потоки.

Observable.merge(
    Observable.just("A", "B"),
    Observable.just(1, 2)
).subscribe { println(it) } // A, B, 1, 2 (или в другом порядке)

Ключевое отличие: zip синхронизирует элементы, merge просто сливает потоки.