Kotlin學習筆記(13)- 函數式編程

系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正。如果你覺得我的文章對你有用,歡迎關注我,我們一起學習進步!
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
  1. 首先我們看一下函數是怎么作為另一個函數的參數被定義的:fun logic(a: Int, b: Int, calc: (Int, Int) -> Int),這其中參數a和b我們就不看了,來看看第三個參數calc,它就是一個函數,由此我們可以總結出它的語法應該是這樣:

    參數名: (參數類型,參數類型...) -> 輸出類型
    

    其中,參數名不一定是方法名,參數類型是這個函數參數的輸入類型,如果是無參函數,括號()不可省略!不可省略!不可省略!!

  2. 然后我們再來看一下函數作為參數是如何調用的:println("calc : ${calc(a,b)}"),其中calc(a,b)為對方法的調用,除了方法名是我們定義的參數名之外,其他的和平時使用函數一樣。

  3. 再然后我們就要看一下最重要的一點,就是函數作為參數,是怎么傳遞進去的

    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的使用,關于這部分我還在學習,會盡快寫出來和大家交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容