为什么我的 RX 链中得到的是 KFunction1 而不是 List<E>?

Why do I get a KFunction1 instead of List<E> in my RX chain?

在我的映射方法中,我试图将我的 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<AbwEANVO>,但 Kotlin 告诉我发现了一个 KFunction1<@ParameterName List<AbwEANDTO>, List<AbwEANVO>>!。这是一个典型的类型不匹配错误,但我真的无法向自己解释为什么会这样。

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

在您的 map 调用中,您通过使用花括号 {} 传递一个 lambda,它接受传入参数,忽略它,returns 一个函数引用。这与在此处写下此代码相同:

.map { it -> ::dtoToVo }

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

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

.map(::dtoToVo)

这将为每个元素调用 dtoToVo 函数,并使用该函数 returns 继续流。所以这相当于:

.map { it -> dtoToVo(it) }