➡️ Простой API
Для каждого отдельного случая RxJava может использовать множество типов потоков — Observable, Flowable, Maybe, Single, Completable. В Kotlin весь этот функционал дублируется только двумя типами: suspend fun и Flow, при этом асинхронные выражения в нем могут вызываться с помощью простых лямбда-выражений, что значительно упрощает разработку. То есть, у программистов практически пропадает необходимость создавать одинаковый код для каждого типа пять раз, по количеству видов потоков.
➡️ Kotlin Multiplatform
Как понятно из названия, RxJava поддерживает только язык Java, в то время как Coroutines способны работать на любой платформе, поддерживающей Kotlin. Следовательно, если возникнет необходимость, например, переиспользовать асинхронный код между Android и iOS, то с помощью корутин это можно сделать без проблем.
➡️ Структурированная многопоточность
В отличие от склонных к утечкам потоков Rx, Coroutines обрабатывают входящие объекты даже если сам программист про них забыл. Структурированность корутинов Kotlin значительно упрощает управление жизненным циклом открытых потоков.
➡️ Простые операторы
Создание кастомных операторов в Rx может стать настоящим испытанием для разработчика, поскольку требует глубокого понимания того, как фреймворк работает «под капотом». Во Flow они пишутся как весь остальной код, благодаря чему вместо сотни строк кода, зачастую, можно обойтись всего парой строчек.
➡️ Производительность
Судя по результатам тестирования с помощью Reactive Scrabble — стандарта для проверки эффективности потоков, производительность Flow корутин значительно превосходит RxJava.
➡️ Простое управление back-pressure
Когда данные выдаются быстрее, чем принимающий поток успевает их обрабатывать возникает back-pressure — переизбыток входящих событий. Для Rx это большая проблема и причина появления избыточного и запутанного кода во фреймворке, поскольку для избежания переизбытка испускающие потоки должны постоянно взаимодействовать с принимающими.
Flow корутин справляется с этим куда проще. Если в какой то момент входящих данных становится слишком много, он просто откладывает на время испускающие события потоки. В результате программисту не нужно так часто заниматься back-pressure, что экономит драгоценное время.
➡️ Взаимозаменяемость
Корутины и Rx обладают хорошей взаимозаменяемостью. Благодаря преобразователям, поставляемых Kotlin, программисты могут переводить проект из Rx во Flow поэтапно и даже продолжить использование Rx-библиотек в своем проекте, при этом код не придется переписывать вручную. Кроме того, у Coroutines есть инструменты, позволяющие автоматически переводить устаревшие потоки Rx на Flow.