Что такое оператор switchMap в RxJava

Ответ

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 — это твой выбор, когда нужна только последняя активность. Поиск, обновление по таймеру, всякие фичи с автодополнением. Берёшь и используешь, не ошибёшься.