【问题标题】:How to combine two kotlin data objects with shared variable into one object?如何将两个带有共享变量的 kotlin 数据对象合并为一个对象?
【发布时间】:2020-05-25 20:07:27
【问题描述】:

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

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

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

  • symbol(这是两个api调用之间的共享值,所以这需要 匹配)
  • 报价量
  • 百分比变化
  • lastTradeRate

粗体变量是一个 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
                        )
                    )
                }
            }
        }
    }

【问题讨论】:

    标签: android json kotlin retrofit


    【解决方案1】:

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

    假设 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
        }
    }
    

    【讨论】:

    • 但是我仍然需要一些方法来检查两个数据对象的“符号”是否相同,最好不要每次都遍历两个列表。
    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2021-06-26
    • 1970-01-01
    • 2018-11-27
    • 2017-01-17
    • 2018-04-21
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多