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;
}
}
)