系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正。如果你覺得我的文章對你有用,歡迎關注我,我們一起學習進步!
Kotlin學習筆記(1)- 環境配置
Kotlin學習筆記(2)- 空安全
Kotlin學習筆記(3)- 語法
Kotlin學習筆記(4)- 流程控制
Kotlin學習筆記(5)- 類
Kotlin學習筆記(6)- 屬性
Kotlin學習筆記(7)- 接口
Kotlin學習筆記(8)- 擴展
Kotlin學習筆記(8)- 擴展(續)
Kotlin學習筆記(9)- 數據類
Kotlin學習筆記(10)- 泛型
Kotlin學習筆記(11)- 內部類和嵌套類
Kotlin學習筆記(12)- 委托
Kotlin學習筆記(13)- 函數式編程
Kotlin學習筆記(14)- lambda
kotlin是一種函數式編程語言,在百度百科上是這么定義函數式變成的:
簡單說,"函數式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論。
它屬于"結構化編程"的一種,主要思想是把運算過程盡量寫成一系列嵌套的函數調用。
在之前的文章《Kotlin學習筆記(4)- 流程控制》中我們講過,可以通過if..else
或者when
等控制語句直接給變量賦值,這其實也是函數式編程的一種體現。當然kotlin中的函數式思想不可能只有這些,它把函數也作為了“一等公民”,和其他類平級。也就是說,我們的變量或者參數的類型,可以是一個類,也可以是一個函數!!作為一個Android攻城獅,這一特性接受起來是很困難的,但無疑它是很強大的,所以值得我們花更多的精力去學習它!。
一、函數參數
首先我們來簡單的聲明一個函數:
fun sum(a: Int, b: Int) = a + b
剛剛我們說過,kotlin中函數也是“一等公民”,那么它是怎么像其他類一樣傳遞的呢?我們來看一下
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
-
首先我們看一下函數是怎么作為另一個函數的參數被定義的:
fun logic(a: Int, b: Int, calc: (Int, Int) -> Int)
,這其中參數a和b我們就不看了,來看看第三個參數calc
,它就是一個函數,由此我們可以總結出它的語法應該是這樣:參數名: (參數類型,參數類型...) -> 輸出類型
其中,參數名不一定是方法名,參數類型是這個函數參數的輸入類型,如果是無參函數,括號
()
不可省略!不可省略!不可省略!! 然后我們再來看一下函數作為參數是如何調用的:
println("calc : ${calc(a,b)}")
,其中calc(a,b)
為對方法的調用,除了方法名是我們定義的參數名之外,其他的和平時使用函數一樣。-
再然后我們就要看一下最重要的一點,就是函數作為參數,是怎么傳遞進去的
val num = Number() num.logic(1, 2, num::sum)
可以看到我們使用了
num::sum
這種寫法,其中num
是函數的定義類,sum
是調用的函數名,并且調用的函數sum
的參數類型與輸出類型,要與目標calc
一致。其實對于函數參數,我們更多的是使用lambda的寫法,后面會講。
二、函數返回
既然函數和類同是“一等公民”,那就應該享有同樣的權利,所以相應的,函數也能作為結果返回,我們再來看一下。
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
函數同樣可以作為輸出。我們看到getSumMethod()
返回的就是一個函數,這個定義的完整寫法應該是這樣:
fun getSumMethod() : (Int, Int) -> Int = this::sum
使用起來也和普通方法一樣num.logic(1, 2, num.getSumMethod())
,或者我們同樣可以把它作為一個變量:
val sum = num.getSumMethod()
num.logic(1, 2, sum)
三、小結
總而言之,在kotlin中,你完全可以將函數作為一個普通的類,一個參數,一個返回,事實上,這正是函數式編程的魅力所在。再說一次,函數的類型是
(參數類型,參數類型...) -> 輸出類型
關于函數式編程的更多應用,基本都在lambda的使用,關于這部分我還在學習,會盡快寫出來和大家交流。