RxJava и корутины немного про разное. Rx это про stateless и представление всего в виде стримов иммутабельных стейтов(данных). Корутины это про stateful и про управление множеством асинхронных сущностей.
Так сложилось, что в нашем многопоточном мире в обоих подходах есть concurrency. Но это не значит, что надо брать и противопоставлять Rx корутинам.
Запрос на Rx настолько велик, что в kotlinx завезли flow - это тот же самый реактивный подход, только на основе корутин. С чем боролись, против чего проповедовал Елизаров, на то и напоролись, и ещё наплодили новых операторов, которые тоже надо знать. И усложнили всё чрезвычайно.
flowOf(123)
.map(::calculateSomething)
.filter(::myFilter)
.collect(::collectIt)
Сколько в этом коде Асинхронных запросов? В каком месте оно может уснуть навечно? Неизвестно... фреймворк позволяет легко написать код так, что всё взорвется, а ты и не заметишь.
Хорошо ли то, что с использованием корутин можно писать асинхронный код, по виду идентичный синхронному? Моё мнение - нет, не хорошо, потому что держать в голове две парадигмы про один код - это сложно. А если кто юзал корутины с многопоточностью под iOS(Kotlin/Native), там надо держать в голове
три парадигмы про одинаковый код. Это плохо.
На Rx написано много кода, многим людям без него жить сложно. Многие задачи на Rx решаются настолько проще, что реально думаешь, что без него никак.
Если тебе корутины или Rx нужны, чтобы в сеть сходить на бекграунде, и потом данные показать в UI - тебе ни корутины, ни Rx особо не нужны.