如何将两个具有共享变量的kotlin数据对象组合为一个对象?

时间:2020-05-25 20:07:27

标签: android json kotlin retrofit

我正在做一个小应用程序,该应用程序在Bittrex交易所跟踪加密货币值。

为此,我正在使用Bittrex的公共api(https://bittrex.github.io/api/v3) 不幸的是,该api不能仅通过一次调用就提供我想要的数据,因此我需要进行两次api调用。

我想要实现的是让一个对象包含以下所有值:

  • 符号(这是两个api调用之间的共享值,因此需要 匹配)
  • quoteVolume
  • percentChange
  • lastTradeRate

粗体变量是一个api调用的一部分,其他值是另一个api的一部分。 “符号”是两者的一部分。

我使用的是kotlin协程,我希望我不必使用RxJava之类的东西就可以正常工作。

    CoroutineScope(IO).launch {
        val tickers = async {
            api.getTickers()
        }.await()

        val markets = async {
            api.getMarkets()
        }.await()
        val result = mutableListOf<Market>()
        for (ticker in tickers.data) {
            for (market in markets.data) {
                if (ticker.symbol == market.symbol) {
                    result.add(
                        Market(
                            ticker.symbol,
                            ticker.lastTradeRate,
                            market.quoteVolume,
                            market.percentChange
                        )
                    )
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您可以使用协同程序并行进行两个调用。

假设firstApisecondApi是暂挂函数,它们分别返回您需要的2个信息块的数据,

val data1Deferred = async { firstApi() }
val data2Deferred = async { secondApi() }
val data1 = data1Deferred.await()
val data2 = data2Deferred.await()
val result = Result(
    // build result from data1 and data2
)

您还需要添加错误处理。

编辑:

您可以按符号将列表分组并生成地图:

val marketMap = markets.associateBy { it.symbol }

然后为每个股票提供相应的市场

for (ticker in tickers) {
    val market = marketMap[ticker.symbol]
    if (market != null) {
        // join ticker and market
    }
}