Kotlin-高階函式的使用(二)
文章目錄:
上一篇文章帶大家認識到了什麼是高階函式,那這一章就帶大家看看高階函式的實際使用場景吧
提問
我們想一想,高階函式帶給我們的是什麼,我們為什麼要使用它呢?因為他可以讓我們的方法更簡單高效,能去掉冗餘的樣板程式碼,讓我們關注的邏輯更清晰的展現在我們的面前,所以高階函式一定是用在我們的方法實現上,而官方api其實已經將我們常用的快捷操作用高階函式給封裝好了,比如with
,apply
等操作符,所以剩下的就是介面呼叫了。
不知道大家用Kotlin實現過OnClickListener介面沒有,有3種寫法:
青銅版:
view.setOnClickListener(object :View.OnClickListener{ override fun onClick(v: View?) { //啊!我被點選了 } })
黃金版
view.setOnClickListener { v -> { //啊!我被點選了 } }
鑽石版
view.setOnClickListener { //啊!我被點選了 }
我們一對比發現,程式碼是一步一步被省略的,首先是省略了介面宣告(轉化為了lambda),其次是省略了lambda的花括號(Kotlin的特性,當引數只有一個lambda引數的時候,括號可以省略),所以我們要實現的是如何將介面宣告轉化為lambda,哈哈,這不正是我們高階函式所擅長的嗎
實現
雖然我們不能直接看到kotlin內部的高階函式的實現方式,但是我們按住ctrl
鍵將滑鼠移到方法上是可以看到高階函式的宣告方式的,如你所見是這樣的:
public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit
看過我上篇文章的一眼就能看明白,這是聲明瞭一個以view為引數的無返回值的高階函式,但他是如何實現的呢,請看以下程式碼:
public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit{ //將介面實現並賦值給全域性變數介面方便介面方法呼叫 mOnClickListener = object :View.OnClickListener{ override fun onClick(v: View?) { l.invoke(v) //關鍵是這句 } } }
原理就是內部將介面給例項化,然後將邏輯通過invoke方法代理出去,這樣我們點選事件內部就會走invoke方法啦。而invoke實際是一個介面(翻譯成java程式碼你就明白啦),所以我們在方法外面實現的其實是invoke的介面實現邏輯,注意,這種介面的實現方式只能在介面只有一個方法的時候哦,因為invoke只有一個,哈哈,怎麼樣,setOnClickListener的處理邏輯小夥伴們明白了嗎,舉一反三的事情就交給各位勤奮的小夥伴了.