我在努力瞭解高階函數以及如何使用Kotlin將函數作爲參數傳遞給其他函數。我有一個基本的例子,我想fufill:Kotlin高階函數如何工作?
fun addOnSearchGameResultListener(
activity: AppCompatActivity,
releaseThread:() -> Unit,
showNoResultsFoundMessage:() -> Unit,
updateSearchResults: (result: List<Game>) -> Unit) {
var event0017Handler: TaskExecutor = object : TaskExecutor {
override fun executeOnSuccessTask(response: JSONObject) {
async() {
uiThread {
try {
releaseThread()
mLoaderManager.hideIndeterminateProgressBar(activity)
val result = mJSONParser.getGamesByGameKey(response)
Log.i(GameController::class.simpleName, "response: ${result.toString()}")
updateSearchResults(result)
} catch (e: JSONException) {
showNoResultsFoundMessage()
}
}
}
}
override fun executeOnErrorTask(payload: JSONObject) {
releaseThread()
mNotificationManager.showErrorPopUp(activity, payload.getString("data"))
}
}
NotificationCenter.RegistrationCenter.registerForEvent(EventCatalog.e0017, event0017Handler)
}
我打電話這樣上面的方法:
private fun updateSearchResults (results : List<Game>?) : (results : List<Game>?) -> Unit = {
if (null != results && results.size > 0) {
mLastMatchingQuery = query_container.text.toString()
hideNoResultsFoundMessage()
mGames = results
mAdapter!!.dataSet = results.toMutableList()
} else {
showNoResultsFoundMessage()
}
}
我知道:
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)
而且updateSearchResults(null)
的聲明當我聲明它時(因爲我需要在編譯時傳遞一些東西),我將null傳遞給func,但是,從addOnSearchGameResultListener()
內部調用的調用不會通過運行時的參數傳遞,我的意思是,在addOnSearchGameResultListener()
我總是得到空的結果。這是如何工作,我做錯了什麼?
非常感謝你,正如用戶@voddan指出的那樣,你修正了上面的答案,我根本沒有使用參數。最後,我遵循你的adivice,並且定義了函數,並在調用中指定了lambda。請你澄清一下,「it」作爲參數傳遞的意思是什麼?: –
@EdgarDaSilvaFernandes [另一個有用的約定是,如果一個函數literal只有一個參數,它的聲明可以省略(和 - >一起),它的名字將是'it'](https://kotlinlang.org/docs/reference/lambdas.html) – miensol