RxJava преобразовать две модели в одну

Получаю курс иностранных валют к рублю https://www.cbr.ru/scripts/XML_daily.asp?date_req=28/03/2020

Модель ответа с сервера:

public class RateCurrencyResponseModel {
    private String id;
    private String name; // Например, USD
    private String charCode;
    private String value; // Текущий курс RUB к USD: 75.60
}

Модель для работы в UI слое:

public class RateCurrencyUiModel {
    private long id;
    private String name; // Например USD
    private String charCode;
    private double value; // Текущий курс RUB к USD: 75.60
    private String change; // Разница со вчерашним курсом: "+0.20"
}

К данным сервера обращаюсь через Retrofit 2 и получаю источник данных:

Single<List<RateCurrencyResponseModel>>

Задача

Нужно преобразовать модель ответа сервера, в модель для работы в UI слое.

Т.е.

Single<List<RateCurrencyResponseModel>>

в

Single<List<RateCurrencyUiModel>>

Проблема

У модели для работы в UI слое есть поле String change, которое содержит разницу текущего курса, со вчерашним курсом.

Как я понял, мне нужно создать два источника данных:

Single<List<RateCurrencyResponseModel>> lastRateCurrency; // Курсы валют за вчерашний день
Single<List<RateCurrencyResponseModel>> newRateCurrency; // Курсы валют за сегодняшний день

Далее через RxJava2 нужно одновременно получать элементы из списков иточников lastRateCurrency и newRateCurrency, сравнивать курс и затем уже создавать модель для Ui слоя и возвращать её уже как:

Single<List<RateCurrencyUiModel>>

Вопрос:

Как мне одновременно передовать элементы списков из источников данных lastRateCurrency и newRateCurrency в третий источник данных, который по итогу вернет Single < List < RateCurrencyUiModel > >?

p.s. С RxJava2 ознакомился, возможно, я не правильно составил решение проблемы, по этому и не понимаю как её решить.


Ответы (1 шт):

Автор решения: Сергей Бувака

Оператор zip объеденяет испускаемые элементы Observable в единый поток. Он дожидается поступления обоих элементов и дальше пускает их по цепочке. Это Должно подойти для ваших целей.

// при условии, что каждый Observable возвращает строку
// здесь вы подставите свою реализацию Single
Single<List<RateCurrencyResponseModel>> lastRateCurrency = Single.just();
Single<List<RateCurrencyResponseModel>> newRateCurrency  = Single.just();

Single.zip(lastRateCurrency, newRateCurrency, new Func2<String, String, MyResult>() {
      @Override
      public MyResult call(<List<RateCurrencyResponseModel>> lastRateCurrency, <List<RateCurrencyResponseModel>> newRateCurrency) {
          // здесь вы выполняете уже свой код по объеденению объектов
          return myResult;
      }
   }
)
→ Ссылка