Kotlin-簡約之美-進(jìn)階篇(十二):閉包

@[toc]

什么是閉包

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。例如在javascript中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,所以閉包可以理解成“定義在一個函數(shù)內(nèi)部的函數(shù)“。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁报亩。

閉包的作用

任何支持函數(shù)式編程的語言都都支持閉包。

  • 讓函數(shù)成為編程語言中的一等公民
  • 讓函數(shù)具有對象所有的能力(封裝)
  • 讓函數(shù)具有狀態(tài)
    很明顯的是java不支持閉包井氢,kotlin的函數(shù)成為一等公民弦追,java中對象是一等公民,對象有狀態(tài)花竞,函數(shù)是沒有狀態(tài)的劲件,調(diào)用完畢后里面的數(shù)據(jù)會被回收,不會被保存
  1. java代碼
public class Test {
    public void test(){
        public void test(){
        }
    }
}
方法里面 放方法约急。報錯,java沒辦法理解這種代碼,在java中 函數(shù)是二等公民
二等公民是不可以出現(xiàn)在函數(shù)里面的零远。他只能出現(xiàn)在類的定義里
  1. kotlin里面
    函數(shù)和普通變量一樣是一等公民,他可以擁有一等公民擁有的所有主權(quán)
fun test(){
     var a=3
     fun test1(){
     }
}

好處是顯而易見的厌蔽,可以在函數(shù)的內(nèi)部聲明函數(shù)牵辣,函數(shù)參數(shù)可以是函數(shù),函數(shù)的返回值可以是函數(shù)奴饮,這就是函數(shù)編程的特點 纬向。java的方法里面,傳遞的參數(shù)只能是數(shù)據(jù)類型戴卜,我們定義的對象和基本數(shù)據(jù)類型逾条,輸出的也是數(shù)據(jù)類型

普通函數(shù)和閉包函數(shù)

普通函數(shù)不攜帶狀態(tài),調(diào)用完畢后里面所有的內(nèi)容就會被釋放掉投剥。
下次調(diào)用的時候师脂,里面的變量會再次去聲明

fun test(){
    var a=3
    println(a);
}
fun main(args: Array<String>) {
    test()
}

函數(shù)不攜帶狀態(tài),維護(hù)起來就需要額外的成本,比如我們需要聲明一個額外的變量來記錄他的狀態(tài)危彩,閉包讓函數(shù)可以攜帶狀態(tài)攒磨。

fun test():()->Unit{
    var a=3 //狀態(tài)
    return  fun(){
        a++;
        println(a);
    }
}
fun main(args: Array<String>) {
    var t=test()
    t();
    t();
    t();
}

我們定義了一個函數(shù)泳桦,返回值是函數(shù) 汤徽。函數(shù)不寫返回值,返回值為空的的時候默認(rèn)為Unit灸撰,Unit可以省略不寫,當(dāng)返回值不為空的時候必須寫出來

fun test():()->Unit

冒號后面寫小括號表名 函數(shù)需要返回一個函數(shù)谒府,()里面可以寫參數(shù), 小括號后面是函數(shù)的返回值類型浮毯,我們不可以寫冒號了完疫,改為->,但返回值的類型為空的時候也必須寫Unit了,不可以省略债蓝。

閉包總結(jié)

函數(shù)里面聲明函數(shù)壳鹤,函數(shù)里面返回函數(shù),就是閉包,函數(shù)內(nèi)部的局部變量的狀態(tài)保存住了 (變量的值就是狀態(tài))饰迹,局部變量的值被隱藏起來了芳誓,但我們調(diào)用函數(shù)可以改變狀態(tài),或者獲得局部變量的值啊鸭,這點就是函數(shù)的面向?qū)ο笄绿剩尯瘮?shù)具有封裝的能力,讓函數(shù)既有了狀態(tài)赠制。

學(xué)習(xí)交流

歡迎入群交流學(xué)習(xí)赂摆,Android、Java開發(fā)技術(shù)交流群

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钟些,一起剝皮案震驚了整個濱河市烟号,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌政恍,老刑警劉巖褥符,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抚垃,居然都是意外死亡喷楣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門鹤树,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣焊,“玉大人,你說我怎么就攤上這事罕伯∏粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坟募。 經(jīng)常有香客問我岛蚤,道長,這世上最難降的妖魔是什么懈糯? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任涤妒,我火速辦了婚禮,結(jié)果婚禮上赚哗,老公的妹妹穿的比我還像新娘她紫。我一直安慰自己,他們只是感情好屿储,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布贿讹。 她就那樣靜靜地躺著,像睡著了一般够掠。 火紅的嫁衣襯著肌膚如雪民褂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天疯潭,我揣著相機與錄音赊堪,去河邊找鬼。 笑死袁勺,一個胖子當(dāng)著我的面吹牛雹食,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播期丰,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼群叶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钝荡?” 一聲冷哼從身側(cè)響起街立,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠通,沒想到半個月后赎离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡端辱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年梁剔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞蔽。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荣病,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渗柿,到底是詐尸還是另有隱情个盆,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站颊亮,受9級特大地震影響柴梆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜终惑,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一绍在、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狠鸳,春花似錦揣苏、人聲如沸悯嗓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脯厨。三九已至铅祸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間合武,已是汗流浹背临梗。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稼跳,地道東北人盟庞。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像汤善,于是被迫代替她去往敵國和親什猖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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