Sto faticando un po 'a capire le funzioni di ordine superiore e come passare le funzioni come parametri ad altre funzioni usando Kotlin. Ho un esempio di base che voglio fufill:Come funzionano le funzioni di ordine superiore di 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)
}
sto chiamando il metodo di cui sopra in questo modo:
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)
E updateSearchResults(null)
è dichiarato come:
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()
}
}
lo so Ho passato null alla funzione quando l'ho dichiarata (perché ho bisogno di passare qualcosa al momento della compilazione), tuttavia, la chiamata effettuata all'interno di addOnSearchGameResultListener()
non viene eseguita passando il parametro dal runtime, Voglio dire, in addOnSearchGameResultListener()
ottengo sempre null per i risultati. Come funziona esattamente e cosa sto sbagliando?
Grazie mille, come ha sottolineato @voddan e hai risolto nella risposta sopra, non stavo usando il parametro. Alla fine ho seguito il tuo annuncio e reso le funzioni regolari e specificato il lambda nella chiamata. Puoi chiarire per favore cosa esattamente ha passato "it" come parametro ?: –
@EdgarDaSilvaFernandes [Un'altra utile convenzione è che se una funzione letterale ha un solo parametro, la sua dichiarazione può essere omessa (insieme a ->), e il suo nome sarà 'it'] (https://kotlinlang.org/docs/reference/lambdas.html) – miensol