Course Content
-
Введение в RxJava 3.0. Способы создания Observable В первом модуле вы узнаете чем отличается Observable от Observer и поймете как создать источник данных
-
Основные операторы RxJava 3.0 Рассмотрим на примерах самые популярные операторы RxJava 3.0 такие как map(), flatMap(), filter() и другие.
-
Выходим в сеть с помощью RxJava
Операторы map() и flatMap()
Map() vs FlatMap()
Необходимыми для разработки приложений часто являются операторы map() и flatMap() которые мы и рассмотрим в этом уроке.
Observable.map()
Одним из наиболее часто используемых операторов RxJava является оператор Map().
C помощью оператора map() можно трансформировать поступающий в него элемент данных, используя лямбда-выражение. Давайте рассмотрим на примере диаграммы:
Как вы уже должны были заметить – оператор map() принимает некую трансформирующую функцию, которая как раз и меняет поступивший элемент. На данной диаграмме – это функция x*10. То есть каждый элемент, поступивший в оператор – на выходе – будет умножен на 10. Таким образом, конечный подписчик – получит значения 10, 20,30.
Давайте теперь рассмотрим более сложный пример.
В Android – приложениях хорошим тоном является конвертирование данных, которые приходят с сервера в модель, использующуюся в приложении. Например конвертирование данных из DTO (Data Transfering Object) в VO (View Object). Это позволяет в том случае, если модель, возвращаемая с бэкенда изменится, поменять только логику конвертирования данных и не менять все приложение.
Для конвертирования мы можем использовать оператор map(). В качестве примера мы будем использовать BookDto. На слайде указаны два типа BookDto и BookVo. Обратите внимание что поле price из BookVo имеет тип данных String – это необходимо для отображения знака валюты.
Теперь нам необходимо создать метод для конвертации согласно бизнес-логике. Мы конвертируем поле size из килобайт в мегабайты, и форматируем цены.
Теперь давайте перейдем к использованию оператора map(). Для этого создадим Dto объект и подпишемся на получения данных. Чтобы применить оператор map() необходимо вызвать метод map() и передать лямбда выражение, которое будет применяться к каждому полученному выше элементу.
В данном случае будет вызван метод конвертации DTO в ViewObject. На выходе мы получим немного измененную модель, которую можем использовать для отображения в графическом интерфейсе приложения.
Оператор flatMap()
Теперь давайте рассмотрим оператор flatMap()
flatMap() так же применяет функцию к каждому излучаемому элементу, но эта функция возвращает тип Observable. Т.е. 1 излучаемый элемент может через flatMap породить множество излучаемых элементов или не одного.
Наиболее часто flatMap() используют, когда вам нужно в зависимости от предыдущего значения цепочки выполнить нужное действие и дать возможность подписаться подписчику на результат этого действия. Например, это может быть запрос к бэкенду, к базе данных или стороннему SDK.
В данном примере, несмотря на то, что начальный Observable излучает только один элемент – строку day, с помощью Observable.flatMap() мы можем изменить поток таким образом, что подписчик получит несколько данных, в зависимости от того какая строка придет.
Надеюсь, теперь разница между этими двумя операторами понятна. Далее мы познакомимся с операторами для переключения между потоками и рассмотрим различные виды планировщиков.