1. 程式人生 > 其它 >學習Kotlin之高階函式

學習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表示式中的最後一行程式碼會自動作為返回值)