为什么我的 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) }
在我的映射方法中,我试图将我的 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) }