gpt4 book ai didi

android - Kotlin 高阶函数如何工作?

转载 作者:IT老高 更新时间:2023-10-28 13:45:42 26 4
gpt4 key购买 nike

我很难理解高阶函数以及如何使用 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)
}

我是这样调用上面的方法的:

mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)

updateSearchResults(null)被声明为:

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()
}
}

我知道我在声明它时将 null 传递给了 func(因为我需要在编译时传递一些东西),但是,从内部进行的调用 addOnSearchGameResultListener() 并没有传递来自运行时的参数,我的意思是,在 addOnSearchGameResultListener() 我总是得到 null 结果。这到底是如何工作的,我做错了什么?

最佳答案

我认为混淆来自参数名称,尤其是 results。要解决这个问题,您可以将 updateSearchResults 更改为 i.e.:

private fun updateSearchResults() : (List<Game>?) -> Unit = { results ->
if (null != results && results.size > 0) {
mLastMatchingQuery = query_container.text.toString()
hideNoResultsFoundMessage()
mGames = results
mAdapter!!.dataSet = results.toMutableList()
} else {
showNoResultsFoundMessage()
}
}

但是,我确实认为如果您应用以下更改,则更容易遵循代码:

  • 制作updateSearchResults常规方法:

    private fun updateSearchResults (results : List<Game>?) {
    if (null != results && results.size > 0) {
    mLastMatchingQuery = query_container.text.toString()
    hideNoResultsFoundMessage()
    mGames = results
    mAdapter!!.dataSet = results.toMutableList()
    } else {
    showNoResultsFoundMessage()
    }
    }
  • 更改 addOnSearchGameResultListener 调用并传递一个 lambda

    mGameService.addOnSearchGameResultListener(
    this,
    releaseThread(),
    showNoResultsFoundMessage(),
    { updateSearchResults(it) }
    )
  • releaseThreadshowNoResultsFoundMessage

  • 应用类似的更改

关于android - Kotlin 高阶函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com