如何将两个具有共享变量的 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 调用之间的共享值,因此这需要
匹配)
- 报价量
- 变化百分比
- lastTradeRate
粗体变量是一个 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 个调用。
假设 firstApi
和 secondApi
是暂停函数,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
}
}
我正在制作一个小应用程序来跟踪 Bittrex 交易所的加密货币价值。
为此我使用 Bittrex' public api (https://bittrex.github.io/api/v3) 不幸的是,api 无法通过一次调用提供我想要的数据,因此我需要进行两次 api 调用。
我想要实现的是让一个对象包含以下所有值:
- 符号(这是两个 api 调用之间的共享值,因此这需要 匹配)
- 报价量
- 变化百分比
- lastTradeRate
粗体变量是一个 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 个调用。
假设 firstApi
和 secondApi
是暂停函数,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
}
}