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

How to combine two kotlin data objects with shared variable into one object?

我正在制作一个小应用程序来跟踪 Bittrex 交易所的加密货币价值。

为此我使用 Bittrex' public api (https://bittrex.github.io/api/v3) 不幸的是,api 无法通过一次调用提供我想要的数据,因此我需要进行两次 api 调用。

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

粗体变量是一个 api 调用的一部分,其他值是另一个调用的一部分。 'Symbol' 是两者的一部分。

我正在使用 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
                        )
                    )
                }
            }
        }
    }

您可以使用协程并行进行 2 个调用。

假设 firstApisecondApi 是暂停函数,return 您需要的 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
    }
}