Все, что вам нужно знать об операторах Rx

RxJava набирает обороты в разработке Android. Это горячая тема среди новых и опытных разработчиков. Если вы не знаете, что такое реактивное программирование и каковы преимущества его использования, я настоятельно рекомендую вам прочитать первую статью этой серии: Что такое реактивное программирование?



Реактивное программирование нам полезно двумя способами.

  • Он предоставляет очень простой интерфейс для обработки параллелизма и управления потоками в вашем приложении. Кроме того, он делает код вашего приложения более чистым и читаемым. Если вы не знаете, как использовать RxJava в своем проекте Java или Android, рекомендуется сначала пройти через Создайте код своего следующего приложения с помощью RxJava.


  • Использование операторов Rx. RxOperator - это в основном функция, которая определяет наблюдаемое, как и когда он должен испускать поток данных. В RxJava доступны сотни операторов. Вы можете прочитать алфавитный список всех доступных операторов здесь. Я не могу охватить все полезные операторы в одной статье. Итак, я собираюсь разделить его на две части. В этой и следующей предстоящей статье мы рассмотрим некоторые из наиболее полезных операторов с мраморной диаграммой каждого оператора.

Интересный факт:

  • Большинство операторов работают с Observable и возвращают Observable. Это позволяет вам применять эти операторы один за другим в цепочке. Каждый оператор в цепочке изменяет Observable, полученный в результате работы предыдущего оператора.
  • Цепочка операторов Observable не работает независимо с исходным Observable, который порождает цепочку, но они работают по очереди, каждый из которых работает с Observable, сгенерированным оператором, непосредственно предшествующим в цепочке.

Начнем с нашего первого оператора.

Есть много повторяющихся операторов, которые имеют почти одинаковую функциональность. Я постараюсь прикрыть их одновременно.

Создание наблюдаемых

1. просто ():

Как следует из названия, просто оператор выдает те же значения, которые указаны в аргументах. Ничего больше.

Здесь к нашему наблюдаемому только что применен оператор. Таким образом, observable будет выводить одно за другим от 1 до 5 целых чисел.

  • Существует еще один оператор from (), который принимает массив объекта в качестве входных данных и генерирует объект один за другим, как just () оператор. Ниже приведены фрагменты кода для выдачи целых чисел от 1 до 5 с помощью оператора from ().

Операторы фильтрации:

  • Операторы фильтрации будут отфильтровывать объекты потока данных на основе некоторого выражения и генерировать только те объекты данных, которые удовлетворяют этому выражению.
  • Здесь я собираюсь объяснить некоторые из них. Вы можете найти полный список Filtering Observables здесь.

1. filter ():

Иногда мы хотим уточнить конкретное событие только для того, чтобы его генерировал наблюдаемый. Допустим, в нашем примере выше мы хотим выдавать только нечетные числа из наблюдаемого. Этого можно добиться, используя другой оператор filter ().

Как следует из названия, оператор фильтра фильтрует элементы, испускаемые Observable. Все, что вам нужно сделать, это сообщить оператору, погоду, чтобы испустить объект или нет, в зависимости от некоторых условий.

2. skip ():

skip (n) подавляет первые n элементов, выдаваемых Observable, и передает данные после n элементов. Итак, skip (2) испускает первые 2 элемента и начинает с испускания 3-го элемента.

Итак, в нашем примере, если мы применим оператор skip (2), он выдаст только 3, 4 и 5 целых чисел.

  • Есть еще один оператор skipLast (). Этот оператор выдаст только последний элемент потока данных.

3. take ():

take () противоречит оператору skip (). take (n) выдаст только первые n элементов данных и проигнорирует все элементы данных после того, как переданы n элементов.

  • Оператор takeLast () выдаст только последний элемент из потока данных.
  • В отличие от вышеизложенного, оператор takeFirst () генерирует только первый элемент потока данных и игнорирует последующие элементы данных.

Объединение операторов:

  • Комбинирующие операторы объединяют более двух потоков данных, излучаемых разными наблюдаемыми объектами, и порождают единый поток данных.
  • Полный список операторов комбинирования можно найти здесь.

1. concat ():

Как следует из названия, вы можете использовать оператор concat () для объединения двух разных наблюдаемых объектов и передачи потока данных для обоих операторов один за другим.

Допустим, у вас есть два наблюдаемых. Каждый из них излучает от целого числа от 1 до 5 и от 6 до 10 соответственно. Если мы объединим их, наблюдаемое 1 будет излучать от 1 до 5, а наблюдаемое 2 будет излучать данные от 6 до 10 одновременно. Оператор concat () объединит поток данных и выдаст данные из наблюдаемого объекта 1, а затем после этого будет выдавать данные из наблюдаемого объекта 2. Ниже приведена мраморная диаграмма, объясняющая ту же концепцию.

2. merge ():

Оператор merge () работает так же, как оператор concat (), и объединяет поток данных из двух разных наблюдаемых объектов. Единственная разница между оператором merge () и concat () заключается в том, что слияние может чередовать выходные данные, в то время как concat сначала ожидает завершения более ранних потоков, прежде чем обрабатывать более поздние потоки.

Таким образом, в отличие от оператора concat (), оператор merge () не ждет завершения данных из наблюдаемого объекта 1. Он передает данные из обоих наблюдаемых одновременно, как только данные становятся доступными для излучения.

3. zip ():

Оператор zip () объединяет выбросы нескольких Observable вместе с помощью указанной функции и генерирует отдельные элементы для каждой комбинации на основе результатов этой функции.

Вот пример, в котором вы можете объединить потоки строк и целочисленных данных в один ZipObject (настраиваемый класс) и выдать их как конечный поток данных.

Вы можете предложить мне операторов Rx, которых хотите видеть в комментариях ниже. Я постараюсь осветить их в следующей (и последней) части.

Если вам понравилась статья, нажмите 💚 ниже, чтобы ее увидело больше людей! Убедитесь, что вы подписаны на меня в Medium или Twitter, чтобы получать обновления всякий раз, когда публикуется новая статья.