Какие операторы RxJava используются чаще всего
Что проверяют
Различаете ли вы похожие операторы и понимаете ли работу с потоками выполнения, а не просто помните названия. Почти всегда следом просят сравнить flatMap, concatMap и switchMap и рассказать, как вы избегаете утечек подписок.
Как отвечать
Речь про RxJava 3, вторая версия давно не поддерживается. Операторы удобно называть по задачам:
- преобразование:
mapменяет каждый элемент;flatMapпревращает элемент в поток и сливает результаты без гарантии порядка;concatMapделает то же последовательно;switchMapотменяет предыдущий внутренний поток при новом элементе, стандарт для поиска по вводу; - фильтрация:
filter,distinctUntilChanged,debounceдля поля поиска,throttleFirstпротив двойного нажатия; - комбинирование:
zipсклеивает элементы попарно и завершается с самым коротким источником;combineLatestотдаёт свежую комбинацию при любом изменении, удобно для валидации формы;mergeперемешивает элементы по мере прихода;concatподписывается на источники по очереди; - ошибки:
onErrorReturn,onErrorResumeNext,retryс числом попыток илиretryWhenс задержкой; - потоки:
subscribeOn(Schedulers.io())задаёт, где стартует источник, и из нескольких вызовов действует ближайший к нему;observeOn(AndroidSchedulers.mainThread())переключает всё ниже по цепочке и ставится сколько угодно раз.
Упомяните типы: Single для одного сетевого ответа, Completable для операции без результата, Flowable с backpressure для быстрых источников. Подписки складывают в CompositeDisposable и очищают в onCleared() у ViewModel.
Новый код на Android чаще пишут на корутинах и Flow, поэтому хорошо звучит сопоставление: switchMap ближе всего к flatMapLatest, debounce есть и там.
Где спотыкаются
Говорят, что merge сохраняет порядок. Порядок источников держит concat, а merge отдаёт элементы по мере прихода.
Ставят subscribeOn несколько раз, рассчитывая переключить поток посреди цепочки. Для этого нужен observeOn.
Забывают про dispose. Ответ сети приходит после закрытия экрана, колбэк трогает уничтоженную вьюшку, и получается утечка или падение.