将一种类型的Observable转换为另一种类型

时间:2018-10-19 20:55:43

标签: kotlin observable rx-java2

我有以下代码

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的{​​{1}}内的getRates()中使用它

货币包含一个Map对象,可以将其转换为List对象。我不清楚如何在CurrencyRepository

中执行此操作

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是

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

我建议您分批在数据库中插入项目,因为这样会更有效。