Kotlin-高階函數(shù)的使用(二)

文章目錄:

上一篇文章帶大家認(rèn)識(shí)到了什么是高階函數(shù),那這一章就帶大家看看高階函數(shù)的實(shí)際使用場(chǎng)景吧

提問(wèn)

我們想一想,高階函數(shù)帶給我們的是什么,我們?yōu)槭裁匆褂盟??因?yàn)樗梢宰屛覀兊姆椒ǜ?jiǎn)單高效,能去掉冗余的樣板代碼,讓我們關(guān)注的邏輯更清晰的展現(xiàn)在我們的面前,所以高階函數(shù)一定是用在我們的方法實(shí)現(xiàn)上,而官方api其實(shí)已經(jīng)將我們常用的快捷操作用高階函數(shù)給封裝好了,比如with,apply等操作符,所以剩下的就是接口調(diào)用了。

不知道大家用Kotlin實(shí)現(xiàn)過(guò)OnClickListener接口沒(méi)有,有3種寫(xiě)法:

青銅版:

 view.setOnClickListener(object :View.OnClickListener{
            override fun onClick(v: View?) {
                  //??!我被點(diǎn)擊了
            }
        })

黃金版

view.setOnClickListener { v ->
            {
                //??!我被點(diǎn)擊了  
            }
        }

鉆石版

 view.setOnClickListener {
                //啊!我被點(diǎn)擊了  
        }

我們一對(duì)比發(fā)現(xiàn),代碼是一步一步被省略的,首先是省略了接口聲明(轉(zhuǎn)化為了lambda),其次是省略了lambda的花括號(hào)(Kotlin的特性,當(dāng)參數(shù)只有一個(gè)lambda參數(shù)的時(shí)候,括號(hào)可以省略),所以我們要實(shí)現(xiàn)的是如何將接口聲明轉(zhuǎn)化為lambda,哈哈,這不正是我們高階函數(shù)所擅長(zhǎng)的嗎

實(shí)現(xiàn)

雖然我們不能直接看到kotlin內(nèi)部的高階函數(shù)的實(shí)現(xiàn)方式,但是我們按住ctrl鍵將鼠標(biāo)移到方法上是可以看到高階函數(shù)的聲明方式的,如你所見(jiàn)是這樣的:

public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit

看過(guò)我上篇文章的一眼就能看明白,這是聲明了一個(gè)以view為參數(shù)的無(wú)返回值的高階函數(shù),但他是如何實(shí)現(xiàn)的呢,請(qǐng)看以下代碼:

public final fun setOnClickListener( l: ((v: View!) → Unit)! ): Unit{
    //將接口實(shí)現(xiàn)并賦值給全局變量接口方便接口方法調(diào)用
    mOnClickListener = object :View.OnClickListener{
                  override fun onClick(v: View?) {
                           l.invoke(v) //關(guān)鍵是這句
                  }
              }
}

原理就是內(nèi)部將接口給實(shí)例化,然后將邏輯通過(guò)invoke方法代理出去,這樣我們點(diǎn)擊事件內(nèi)部就會(huì)走invoke方法啦。而invoke實(shí)際是一個(gè)接口(翻譯成java代碼你就明白啦),所以我們?cè)诜椒ㄍ饷鎸?shí)現(xiàn)的其實(shí)是invoke的接口實(shí)現(xiàn)邏輯,注意,這種接口的實(shí)現(xiàn)方式只能在接口只有一個(gè)方法的時(shí)候哦,因?yàn)閕nvoke只有一個(gè),哈哈,怎么樣,setOnClickListener的處理邏輯小伙伴們明白了嗎,舉一反三的事情就交給各位勤奮的小伙伴了.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 人生苦多,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類(lèi)型編程...
    任半生囂狂閱讀 26,762評(píng)論 9 118
  • 寫(xiě)在開(kāi)頭:本人打算開(kāi)始寫(xiě)一個(gè)Kotlin系列的教程,一是使自己記憶和理解的更加深刻,二是可以分享給同樣想學(xué)習(xí)Kot...
    胡奚冰閱讀 1,389評(píng)論 1 5
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù),函數(shù)就是值。所有函數(shù)都消費(fèi)函數(shù),...
    JackChen1024閱讀 6,370評(píng)論 1 17
  • 不重要的廢話 前段時(shí)間看了一遍《Programming Kotlin》,主要目的是想提高自己的英文閱讀能力,能力提...
    珞澤珈群閱讀 3,584評(píng)論 1 7
  • 瘧疾是一種周期性發(fā)冷發(fā)燒的傳染病。病原體是瘧原蟲(chóng)。由瘧蚊傳染到人體血液中,發(fā)虐子,有的地區(qū)叫打擺子。 作為世界上殺...
    量子哥閱讀 325評(píng)論 16 15

友情鏈接更多精彩內(nèi)容