kotlin高階函數(shù)之?dāng)U展函數(shù)以及接口回調(diào)

上節(jié)我們講了Kotlin的函數(shù)式編程朋凉,本章我們來講一下kotlin的擴展函數(shù)以及與Java不同的接口回調(diào)墓毒。

一团秽、擴展函數(shù)的定義及原理

擴展函數(shù)其實就是相當(dāng)于Java中的靜態(tài)方法踪栋,這個靜態(tài)方法的參數(shù)是接收者類型的對象眷唉,那么利用這個對象就可以訪問這個類中的成員屬性和方法了,并且最后會返回該對象本身摩泪,這樣在外部感覺和使用類的成員函數(shù)是一樣的捏检,但和成員函數(shù)還是不同的,成員函數(shù)是真正的在該類內(nèi)部,而擴展函數(shù)只不過是偽裝為內(nèi)部調(diào)用,也就無法訪問類的成員屬性和方法茸苇。

二、擴展函數(shù)的使用

只需要把擴展的類或者接口名稱漩氨,放到即將要添加的函數(shù)名前面。這個類或者名稱就叫做接收者類型,類的名稱與函數(shù)之間用"."調(diào)用連接。this指代的就是接收者對象,它可以訪問擴展的這個類可訪問的方法和屬性赴魁。

//創(chuàng)建一個data的類,data也是kotlin的關(guān)鍵字潘拱,內(nèi)部幫我們實現(xiàn)了get,set方法
data class UserBean(var name:String,var age:Int)

//創(chuàng)建擴展函數(shù)
fun UserBean.print(){
println("姓名:$name 年齡:$age")
}

//調(diào)用
val user = UserBean("Bob",21)
user.print()

那既然有擴展函數(shù)辑鲤,肯定也得有擴展屬性,我們來看下怎么實現(xiàn)

data class UserBean(var name:String,var age:Int)
var UserBean.realName:String
   get() = realName
   set(newName) {
   realName = newName
}

#################################################################

前邊講了擴展函數(shù)和擴展屬性,下面我們來學(xué)一些Kotlin的接口回調(diào)和java有什么不同

在java中實現(xiàn)

//創(chuàng)建一個接口
public interface CallBackJava {
void  print(String name,int age);
}
//創(chuàng)建業(yè)務(wù)邏輯層
public class Presser {
private CallBackJava callBack;

private void init() {
    //todo
    //接口回調(diào)
    if (callBack != null) callBack.print("Bob", 21);
}
//設(shè)置callback
public void setCallBack(CallBackJava callBack) {
    this.callBack = callBack;
}
}

//調(diào)用層調(diào)用
Presser presser = new Presser();
    presser.setCallBack(new CallBackJava() {
        @Override
        public void print(String name, int age) {
            System.out.println(name+age);
        }
    });

在kotlin中這樣實現(xiàn)

interface CallBack {
  fun print(name:String,age:Int)
}

class Presser {
private var callBack: CallBackJava? = null
private fun init() {
    callBack?.print("Bob", 21)
}

fun setCallBack(callBack: CallBackJava?) {
    this.callBack = callBack
}
} 
//調(diào)用
 val presser = Presser()
 presser.setCallBack { name, age -> println("$name$age") }

what???這不是和java一樣嗎惑芭,也沒顯得多簡潔啊逃沿,稍等我們可以這樣優(yōu)化,Kotlin不是可以將函數(shù)賦值給變量嗎哄尔,我們省略創(chuàng)建接口富拗,利用變量來代替葵擎,通過invoke調(diào)用,這樣是不是更簡潔了呢這也是利用了kotlin函數(shù)式編程特性的具體應(yīng)用

class Presser {
private fun init() {
    callBack.invoke("Bob", 21)
}
fun setCallBack(callBack: (name: String, age: Int) -> Unit) {
    this.callBack = callBack
}
private lateinit var callBack: (name: String, age: Int) -> Unit
}
//調(diào)用
    val presser = Presser()
    presser.setCallBack { name, age ->
        println("$name$age")
    }

總結(jié):當(dāng)然冠摄,如果是接口中多個回調(diào),就沒辦法用函數(shù)式改造了,如果整合成一個惰瓜,通過定義type類型來操作也是可以流强。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柴淘,一起剝皮案震驚了整個濱河市第股,隨后出現(xiàn)的幾起案子涉馅,更是在濱河造成了極大的恐慌,老刑警劉巖晤揣,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桥爽,死亡現(xiàn)場離奇詭異,居然都是意外死亡碉渡,警方通過查閱死者的電腦和手機滞诺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門炫隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伪阶,“玉大人栅贴,你說我怎么就攤上這事檐薯√陈疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膨俐。 經(jīng)常有香客問我敛摘,道長兄淫,這世上最難降的妖魔是什么捕虽? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捅暴,結(jié)果婚禮上蓬痒,老公的妹妹穿的比我還像新娘梧奢。我一直安慰自己亲轨,他們只是感情好瓶埋,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布曾撤。 她就那樣靜靜地躺著渐裸,像睡著了一般装悲。 火紅的嫁衣襯著肌膚如雪洞渤。 梳的紋絲不亂的頭發(fā)上载迄,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音惋耙,去河邊找鬼绽榛。 笑死蒜田,一個胖子當(dāng)著我的面吹牛美莫,可吹牛的內(nèi)容都是我干的厢呵。 我是一名探鬼主播襟铭,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哩都!你這毒婦竟也來了漠嵌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤约炎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后热芹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體府寒,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡株搔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年纵隔,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌刮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俄认,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出役拴,到底是詐尸還是另有隱情,我是刑警寧澤褥紫,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站氨菇,受9級特大地震影響查蓉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一霜浴、第九天 我趴在偏房一處隱蔽的房頂上張望阴孟。 院中可真熱鬧温眉,春花似錦、人聲如沸凌蔬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至外永,卻和暖如春拧咳,著一層夾襖步出監(jiān)牢的瞬間伯顶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工骆膝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祭衩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓阅签,卻偏偏與公主長得像掐暮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子政钟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容