@[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ù)會被回收,不會被保存
- java代碼
public class Test {
public void test(){
public void test(){
}
}
}
方法里面 放方法约急。報錯,java沒辦法理解這種代碼,在java中 函數(shù)是二等公民
二等公民是不可以出現(xiàn)在函數(shù)里面的零远。他只能出現(xiàn)在類的定義里
- 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ù)交流群
- QQ群:810970432
- email:geduo_83@163.com