[英]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,該花括號接受傳入的參數,將其忽略,然后返回函數引用。 與在此處寫下此代碼相同:
.map { it -> ::dtoToVo }
因此,從該點開始,您將獲得一個函數引用流,最后訂閱它時,它會顯示為KFunction
。
要正確傳遞函數引用,請使用常規括號:
.map(::dtoToVo)
這將為每個元素調用dtoToVo
函數,並使用該函數返回的內容繼續流。 因此,這等效於:
.map { it -> dtoToVo(it) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.