Конвертировать наблюдаемые одного типа в другой - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий код

class CurrencyRepository @Inject constructor(val apiInterface: ApiInterface,
                                             val ratesDao: RatesDao) {
    fun getRates(): Observable<List<Rates>> {
        val observableFromApi = getCurrencyFromApi()
        val observableFromDb = getRatesFromDb()
        return Observable.concatArrayEager(observableFromApi , observableFromDb)
    }

    private fun getCurrencyFromApi(): Observable<Currency> {
        return apiInterface.getRates()
                .doOnNext {
                    Timber.i(it.toString())
                    val map = it.rates
                    val keys = map.keys
                    for (key in keys) {
                        ratesDao.insertRate(Rates(key , map.get(key)))
                    }
                }
    }

    private fun getRatesFromDb(): Observable<List<Rates>> {
        return ratesDao.getAllRates()
                .toObservable()
                .doOnNext {
                    for (rate in it) {
                        Timber.i("Repository DB ${it.size}")
                    }
                }
    }
}

В getCurrencyFromApi(), getRates() возвращает мне Observable<Currency>.Я хотел бы, чтобы эта конкретная функция возвращала Observable<List<Rates>>, чтобы я мог использовать ее в Observable.concatArrayEager внутри getRates() из CurrencyRepository

Валюта содержит объект Map, который можно преобразовать в объект List.Я не понимаю, как это сделать внутри getCurrencyFromApi()

1 Ответ

0 голосов
/ 20 октября 2018

Одним из возможных решений является

fun getRatesFromApi(): Observable<List<Rates>> {
    return apiInterface.getRates()
        .flatMapIterable { it.rates.entries }
        .map { Rates(it.key ,it.value) }
        .doOnNext { ratesDao.insertRate(it) }
        .toList()
        .toObservable()
}

Я советую вам вставлять элементы в базу данных в один пакет, потому что это будет более эффективным.

...