系列文章全部為本人的學(xué)習(xí)筆記蚯瞧,若有任何不妥之處,隨時(shí)歡迎拍磚指正品擎。如果你覺(jué)得我的文章對(duì)你有用埋合,歡迎關(guān)注我,我們一起學(xué)習(xí)進(jìn)步萄传!
Kotlin學(xué)習(xí)筆記(1)- 環(huán)境配置
Kotlin學(xué)習(xí)筆記(2)- 空安全
Kotlin學(xué)習(xí)筆記(3)- 語(yǔ)法
Kotlin學(xué)習(xí)筆記(4)- 流程控制
Kotlin學(xué)習(xí)筆記(5)- 類
Kotlin學(xué)習(xí)筆記(6)- 屬性
Kotlin學(xué)習(xí)筆記(7)- 接口
Kotlin學(xué)習(xí)筆記(8)- 擴(kuò)展
Kotlin學(xué)習(xí)筆記(8)- 擴(kuò)展(續(xù))
Kotlin學(xué)習(xí)筆記(9)- 數(shù)據(jù)類
Kotlin學(xué)習(xí)筆記(10)- 泛型
Kotlin學(xué)習(xí)筆記(11)- 內(nèi)部類和嵌套類
Kotlin學(xué)習(xí)筆記(12)- 委托
Kotlin學(xué)習(xí)筆記(13)- 函數(shù)式編程
Kotlin學(xué)習(xí)筆記(14)- lambda
kotlin是一種函數(shù)式編程語(yǔ)言甚颂,在百度百科上是這么定義函數(shù)式變成的:
簡(jiǎn)單說(shuō),"函數(shù)式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論振诬。
它屬于"結(jié)構(gòu)化編程"的一種蹭睡,主要思想是把運(yùn)算過(guò)程盡量寫成一系列嵌套的函數(shù)調(diào)用。
在之前的文章《Kotlin學(xué)習(xí)筆記(4)- 流程控制》中我們講過(guò)赶么,可以通過(guò)if..else
或者when
等控制語(yǔ)句直接給變量賦值肩豁,這其實(shí)也是函數(shù)式編程的一種體現(xiàn)。當(dāng)然kotlin中的函數(shù)式思想不可能只有這些禽绪,它把函數(shù)也作為了“一等公民”蓖救,和其他類平級(jí)。也就是說(shuō)印屁,我們的變量或者參數(shù)的類型循捺,可以是一個(gè)類,也可以是一個(gè)函數(shù)P廴恕从橘!作為一個(gè)Android攻城獅,這一特性接受起來(lái)是很困難的础钠,但無(wú)疑它是很強(qiáng)大的恰力,所以值得我們花更多的精力去學(xué)習(xí)它!旗吁。
一踩萎、函數(shù)參數(shù)
首先我們來(lái)簡(jiǎn)單的聲明一個(gè)函數(shù):
fun sum(a: Int, b: Int) = a + b
剛剛我們說(shuō)過(guò),kotlin中函數(shù)也是“一等公民”很钓,那么它是怎么像其他類一樣傳遞的呢香府?我們來(lái)看一下
class Number {
fun sum(a: Int, b: Int) = a + b
fun logic(a: Int, b: Int, calc: (Int, Int) -> Int){
println("calc : ${calc(a,b)}")
}
}
fun main(args : Array<String>){
val num = Number()
num.logic(1, 2, num::sum)
}
// 輸出
calc : 3
-
首先我們看一下函數(shù)是怎么作為另一個(gè)函數(shù)的參數(shù)被定義的:
fun logic(a: Int, b: Int, calc: (Int, Int) -> Int)
,這其中參數(shù)a和b我們就不看了码倦,來(lái)看看第三個(gè)參數(shù)calc
企孩,它就是一個(gè)函數(shù),由此我們可以總結(jié)出它的語(yǔ)法應(yīng)該是這樣:參數(shù)名: (參數(shù)類型袁稽,參數(shù)類型...) -> 輸出類型
其中勿璃,參數(shù)名不一定是方法名,參數(shù)類型是這個(gè)函數(shù)參數(shù)的輸入類型推汽,如果是無(wú)參函數(shù)补疑,括號(hào)
()
不可省略!不可省略歹撒!不可省略A椤! 然后我們?cè)賮?lái)看一下函數(shù)作為參數(shù)是如何調(diào)用的:
println("calc : ${calc(a,b)}")
栈妆,其中calc(a,b)
為對(duì)方法的調(diào)用胁编,除了方法名是我們定義的參數(shù)名之外,其他的和平時(shí)使用函數(shù)一樣鳞尔。-
再然后我們就要看一下最重要的一點(diǎn)嬉橙,就是函數(shù)作為參數(shù),是怎么傳遞進(jìn)去的
val num = Number() num.logic(1, 2, num::sum)
可以看到我們使用了
num::sum
這種寫法寥假,其中num
是函數(shù)的定義類市框,sum
是調(diào)用的函數(shù)名,并且調(diào)用的函數(shù)sum
的參數(shù)類型與輸出類型糕韧,要與目標(biāo)calc
一致枫振。其實(shí)對(duì)于函數(shù)參數(shù),我們更多的是使用lambda的寫法萤彩,后面會(huì)講粪滤。
二、函數(shù)返回
既然函數(shù)和類同是“一等公民”雀扶,那就應(yīng)該享有同樣的權(quán)利杖小,所以相應(yīng)的,函數(shù)也能作為結(jié)果返回愚墓,我們?cè)賮?lái)看一下予权。
class Number {
fun sum(a: Int, b: Int) = a + b
fun logic(a: Int, b: Int, calc: (Int, Int) -> Int){
println("calc : ${calc(a,b)}")
}
fun getSumMethod() = this::sum
}
fun main(args : Array<String>){
val num = Number()
num.logic(1, 2, num.getSumMethod())
}
// 輸出
calc : 3
函數(shù)同樣可以作為輸出。我們看到getSumMethod()
返回的就是一個(gè)函數(shù)浪册,這個(gè)定義的完整寫法應(yīng)該是這樣:
fun getSumMethod() : (Int, Int) -> Int = this::sum
使用起來(lái)也和普通方法一樣num.logic(1, 2, num.getSumMethod())
扫腺,或者我們同樣可以把它作為一個(gè)變量:
val sum = num.getSumMethod()
num.logic(1, 2, sum)
三、小結(jié)
總而言之村象,在kotlin中笆环,你完全可以將函數(shù)作為一個(gè)普通的類,一個(gè)參數(shù)煞肾,一個(gè)返回咧织,事實(shí)上,這正是函數(shù)式編程的魅力所在籍救。再說(shuō)一次习绢,函數(shù)的類型是
(參數(shù)類型,參數(shù)類型...) -> 輸出類型
關(guān)于函數(shù)式編程的更多應(yīng)用蝙昙,基本都在lambda的使用闪萄,關(guān)于這部分我還在學(xué)習(xí),會(huì)盡快寫出來(lái)和大家交流奇颠。