Ответ
switchMap — оператор в RxJava, преобразующий элементы потока в новые Observable, но отменяет предыдущие подписки при поступлении новых элементов. Полезен для сценариев, где важна только последняя активность (например, поиск с отменой предыдущих запросов).
Пример:
searchObservable
.switchMap { query ->
api.search(query) // Отменяет предыдущий запрос при новом поиске
}
.subscribe { results ->
// Обновляет UI только для последнего запроса
}
Ключевые особенности:
- Отменяет предыдущие подписки, предотвращая утечки.
- Гарантирует обработку только последнего значения.
- Не сохраняет порядок выполнения, если новые элементы приходят быстрее, чем завершаются старые запросы.
Альтернативы: flatMap (параллельные запросы), concatMap (сохраняет порядок).
Ответ 18+ 🔞
Ну слушай, вот есть у тебя этот switchMap, такая хитрая жопа из операторов RxJava. Представь: ты вводишь запрос в поиск, а он тебе каждый раз новый запрос на сервер шлёт. Без switchMap у тебя бы все запросы летели параллельно, как гомосеки налетели, и потом ещё непонятно, какой ответ первым пришёл — старый или новый. Полный пиздец для UI, чувак.
А switchMap делает гениальную вещь: как только ты ввёл новый символ, он берёт и говорит предыдущему запросу «иди ты нахуй» и отменяет его. Всё, блядь, подписка убита, запрос похерен, ты ему больше не интересен. И запускает новый. Получается, в итоге обрабатывается только последний, самый актуальный запрос. Удобно, ёпта!
Вот смотри на этот кусок кода, тут всё понятно:
searchObservable
.switchMap { query ->
api.search(query) // Как только новая буква — старый запрос в пизду
}
.subscribe { results ->
// А здесь уже результаты только от последнего введённого слова
}
Что он делает, если по-простому:
- Предыдущие подписки отменяет. Это главный козырь. Никаких утечек памяти, всё чисто.
- Гарантирует, что в UI попадёт дерьмо только от последнего запроса. Не будет такого, что ты «ко» написал, а тебе результаты от «к» вдруг всплывут — волнение ебать!
- Но есть нюанс: если новые запросы сыпятся как из пулемёта, а старые долго выполняются, то порядок может накрыться медным тазом. Он не ждёт, блядь, он сразу переключается. Не
concatMap, чтобы очередь соблюдать.
С чем его едят (альтернативы):
flatMap— это когда тебе похуй на порядок и отмены, запускай всё параллельно, хоть овердохуища запросов.concatMap— а это для перфекционистов, которые хотят, чтобы запросы шли строго один за другим, как в очереди в военкомате. Медленно, но упорядоченно.
Короче, switchMap — это твой выбор, когда нужна только последняя активность. Поиск, обновление по таймеру, всякие фичи с автодополнением. Берёшь и используешь, не ошибёшься.