我在努力了解高阶函数以及如何使用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