學習Kotlin之高階函式
定義高階函式
高階函式和Lambda的關係是密不可分的。
定義:如果一個函式接收另一個函式作為引數,或者返回值的型別是另一個函式,那麼該函式就稱為高階函式。
一個新概念:函式型別。程式語言中有整型、布林型等欄位型別,而Kotlin增加了函式型別。
如何定義,語法規則如下:
(String, Int) -> Unit
->左邊是用來宣告該函式接收什麼引數,多個引數用逗號隔開,如果不接受任何引數,寫一對空括號即可;
->右邊是用來宣告該函式的返回值是什麼型別,如果沒有返回值就使用Unit,相當於Java中的void。
現在將函式型別新增某個函式的引數宣告或者返回值宣告上,那麼這個函式就是高階函數了。
fun example(func: (String, Int) -> Unit) { func("hello",123) }
example()函式接收了一個函式型別的引數,它現在是一個高階函式。呼叫方法類似於普通函式。
高階函式的用途
高階函式允許讓函式型別的引數來決定函式的執行邏輯。即使是同一個高階函式,只要傳入不同的函式型別引數,那麼它的執行邏輯和最終的返回結果就可能是完全不同的。
例子:
定義一個num1AndNum2()的高階函式,接收兩個整型和一個函式型別的引數。在此函式中對傳入的兩個整型引數進行某種運算,並返回運算結果,但是具體進行什麼運算是由傳入的函式型別引數決定的。
新建HigherOrderFunction.kt檔案,編寫如下程式碼:
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int{ val result = operation(num1,num2) return result }
第三個引數是函式型別,它接收兩個整型引數並且返回值也是整型的。在num1AndNum2()中我們是看不到具體運算操作的。
具體的運算操作函式還需要繼續定義,在HigherOrderFunction.kt檔案中新增程式碼:
fun plus(num1: Int, num2: Int): Int{ return num1 + num2 } fun minus(num1: Int, num2: Int): Int{ return num1 - num2 }
之後我們就可以呼叫這個高階函數了:
val num1 = 10 val num2 = 20 val result1 = num1AndNum2(num1, num2, ::plus) println("result1 is $result1")
可以看到傳入的第三個引數用了::,這是一種函式引用方法的寫法。
以上雖然是實現了高階函式,但是每次都要定義一個與函式型別引數相匹配的函式,顯得過於複雜了。
所以,Kotlin還支援其他方式呼叫高階函式,比如Lambda表示式,匿名函式,成員引用等。其中Lambda表示式最常用。
* Lambda表示式實現高階函式
我們就可以不用寫對應的plus函數了:
val result1 = num1AndNum2(num1, num2) { n1, n2 -> n1 + n2 }
Lambda表示式同樣可以完整地表達一個函式的引數宣告和返回值宣告(Lambda表示式中的最後一行程式碼會自動作為返回值)