fbpx

Course Content

Total learning: 16 lessons Time: 1 week

Операторы 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() мы можем изменить поток таким образом, что подписчик получит несколько данных, в зависимости от того какая строка придет.

Надеюсь, теперь разница между этими двумя операторами понятна. Далее мы познакомимся с операторами для переключения между потоками и рассмотрим различные виды планировщиков.