簡體   English   中英

為什么我得到一個KFunction1而不是List <E> 在我的RX鏈中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM