【问题标题】:Why do I get a KFunction1 instead of List<E> in my RX chain?为什么在我的 RX 链中得到 KFunction1 而不是 List<E>?
【发布时间】:2019-11-26 14:49:12
【问题描述】:

在我的映射方法中,我试图将我的 DTO 对象从 API 重新映射到我将在 UI 上使用的 VO 对象。

private fun dtoToVo(dto: List<AbwEANDTO>): List<AbwEANVO> {
        return List(dto.size) {
            AbwEANVO(dto[it].key, dto[it].text, false)
        }
    }

我正在我的 RX 链中添加这个方法,如下所示:

    override fun getDeviationLookupTable(test: Boolean) {
        compositeDisposable.add(
            api.getDeviationLookupTable(test)
                .map { ::dtoToVo }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    liveData.value = it
                }, {
                    Log.d(null, "Error@getDeviationLookupTable")
                })
        )
    }

我希望在 it 中得到一个 List&lt;AbwEANVO&gt;,但 Kotlin 告诉我,而不是找到一个 KFunction1&lt;@ParameterName List&lt;AbwEANDTO&gt;, List&lt;AbwEANVO&gt;&gt;!。这是一个典型的类型不匹配错误,但我真的无法向自己解释为什么会这样。

请解释一下我错过了什么。非常感谢。

【问题讨论】:

    标签: android kotlin rx-java


    【解决方案1】:

    在您的map 调用中,您使用花括号{} 传入一个lambda,它接受传入的参数,忽略它,并返回一个函数引用。和那里写下这段代码是一样的:

    .map { it -> ::dtoToVo }
    

    因此,您从该点开始获得函数引用流,当您最后订阅它时,它显示为 KFunction

    要正确传递函数引用,请使用正则括号:

    .map(::dtoToVo)
    

    这将为每个元素调用dtoToVo 函数,并使用该函数返回的任何内容继续流。所以这相当于:

    .map { it -> dtoToVo(it) }
    

    【讨论】:

    • 我不得不承认我不知何故错过了这一点,因为我之前尝试过一些不同的东西。您对我的问题提供了很好的解释。我会记住这一点。非常感谢。
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多