Kotlin高阶函数如何工作?

Edg*_*des 6 android kotlin

我正在努力理解高阶函数以及如何使用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)
    }
Run Code Online (Sandbox Code Playgroud)

我用这种方式调用上面的方法:

mGameService.addOnSearchGameResultListener(
            this,
            releaseThread(),
            showNoResultsFoundMessage(),
            updateSearchResults(null)
    )
Run Code Online (Sandbox Code Playgroud)

并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()
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

mie*_*sol 2

results我认为这种混乱尤其来自于参数名称。要解决该问题,您可以将其更改updateSearchResults为 ie:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,我确实认为如果您应用以下更改,那么遵循代码会更容易:

  • 制作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()
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改addOnSearchGameResultListener调用并传递 lambda

    mGameService.addOnSearchGameResultListener(
            this,
            releaseThread(),
            showNoResultsFoundMessage(),
            { updateSearchResults(it) }
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 应用类似的更改releaseThread,showNoResultsFoundMessage