Tôi đang đấu tranh một chút để hiểu các hàm bậc cao và cách chuyển các hàm thành các tham số cho các hàm khác bằng Kotlin. Tôi có một ví dụ cơ bản mà tôi muốn fufill:Chức năng đặt hàng của Kotlin cao hơn hoạt động như thế nào?
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)
}
Tôi kêu gọi các phương pháp trên theo cách này:
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)
Và updateSearchResults(null)
được khai báo là:
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()
}
}
tôi biết Tôi đã chuyển null thành func khi tôi khai báo nó (vì tôi cần truyền một thứ gì đó ở thời gian biên dịch), tuy nhiên, cuộc gọi được thực hiện từ bên trong addOnSearchGameResultListener()
không được thực hiện thông qua tham số từ thời gian chạy, Ý tôi là, trong addOnSearchGameResultListener()
Tôi luôn nhận được kết quả vô giá trị. Làm thế nào chính xác điều này hoạt động và những gì tôi làm sai?
Cảm ơn bạn rất nhiều, vì người dùng @voddan đã chỉ ra và bạn sửa chữa câu trả lời ở trên, tôi không sử dụng tham số nào cả. Cuối cùng, tôi đã theo dõi ý tưởng của bạn và thực hiện các chức năng thường xuyên và chỉ định lambda trong cuộc gọi. Bạn có thể vui lòng làm rõ cho tôi biết chính xác "nó" được truyền như tham số nghĩa là gì không ?: –
@EdgarDaSilvaFernandes [Một quy ước hữu ích khác là nếu một hàm chỉ có một tham số, khai báo của nó có thể bị bỏ qua (cùng với ->), và tên của nó sẽ là 'it'] (https://kotlinlang.org/docs/reference/lambdas.html) – miensol