文章目錄:
上一篇文章帶大家認識到了什么是高階函數(shù)校镐,那這一章就帶大家看看高階函數(shù)的實際使用場景吧
提問
我們想一想吸祟,高階函數(shù)帶給我們的是什么,我們?yōu)槭裁匆褂盟丶劾裕恳驗樗梢宰屛覀兊姆椒ǜ唵胃咝惴蹋苋サ羧哂嗟臉影宕a,讓我們關注的邏輯更清晰的展現(xiàn)在我們的面前虐拓,所以高階函數(shù)一定是用在我們的方法實現(xiàn)上,而官方api其實已經將我們常用的快捷操作用高階函數(shù)給封裝好了傲武,比如with
,apply
等操作符蓉驹,所以剩下的就是接口調用了。
不知道大家用Kotlin實現(xiàn)過OnClickListener接口沒有谱轨,有3種寫法:
青銅版:
view.setOnClickListener(object :View.OnClickListener{
override fun onClick(v: View?) {
//敖溽!!我被點擊了
}
})
黃金版
view.setOnClickListener { v ->
{
//巴镣诗茎!我被點擊了
}
}
鉆石版
view.setOnClickListener {
//啊献汗!我被點擊了
}
我們一對比發(fā)現(xiàn)敢订,代碼是一步一步被省略的,首先是省略了接口聲明(轉化為了lambda)罢吃,其次是省略了lambda的花括號(Kotlin的特性楚午,當參數(shù)只有一個lambda參數(shù)的時候,括號可以省略),所以我們要實現(xiàn)的是如何將接口聲明轉化為lambda,哈哈尿招,這不正是我們高階函數(shù)所擅長的嗎
實現(xiàn)
雖然我們不能直接看到kotlin內部的高階函數(shù)的實現(xiàn)方式矾柜,但是我們按住ctrl
鍵將鼠標移到方法上是可以看到高階函數(shù)的聲明方式的,如你所見是這樣的:
public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit
看過我上篇文章的一眼就能看明白就谜,這是聲明了一個以view為參數(shù)的無返回值的高階函數(shù)怪蔑,但他是如何實現(xiàn)的呢,請看以下代碼:
public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit{
//將接口實現(xiàn)并賦值給全局變量接口方便接口方法調用
mOnClickListener = object :View.OnClickListener{
override fun onClick(v: View?) {
l.invoke(v) //關鍵是這句
}
}
}
原理就是內部將接口給實例化丧荐,然后將邏輯通過invoke方法代理出去缆瓣,這樣我們點擊事件內部就會走invoke方法啦。而invoke實際是一個接口(翻譯成java代碼你就明白啦),所以我們在方法外面實現(xiàn)的其實是invoke的接口實現(xiàn)邏輯虹统,注意弓坞,這種接口的實現(xiàn)方式只能在接口只有一個方法的時候哦,因為invoke只有一個车荔,哈哈渡冻,怎么樣,setOnClickListener的處理邏輯小伙伴們明白了嗎忧便,舉一反三的事情就交給各位勤奮的小伙伴了.