首頁 > 軟體

Kotlin中Lambda表示式與高階函數使用分析講解

2022-12-07 14:00:50

程式語言的發展,通過需求,不斷的變化出新的特性,而這些特性就會使得程式設計變得更加的簡潔。

Lambda表示式

Lambda表示式的出現,一定程度上使得函數和變數慢慢的融為一體,這樣做的好處大大的方便了回撥函數的使用。

在很多的情況下,其實我們的函數就只有簡單的幾行程式碼,用fun就感覺有點重了,而且有的時候這麼大的函數結構用起來,並不是非常的方便。

Lambda表示式,其表示式為: {變數定義 -> 程式碼塊}

其中:

lambda 函數是一個可以接收任意多個引數(包括可選引數)並且返回單個表示式值的函數

        val sum:(Int,Int) -> Int =  {x: Int, y: Int -> x + y}
        println(sum(1,1))

通常對於求和的程式碼,不過是普通的幾句程式碼,如果定義一個函數會有點麻煩,這裡把函數 看成一個變數,後面我們就可以知道這種寫法的威力。

Lambda表示式 中,使用(Int,Int) -> Int 來定義變數的型別,也就是函數的型別了。當然這一個Lambda表示式 可以簡化為:

        val sum =  {x: Int, y: Int -> x + y}
        println(sum(1,1))

-> 符號代表的是,引數到返回值。

高階函數

函數中帶有以函數為引數,就稱為高階函數,在c語言中,通常是以函數指標傳遞給函數引數,在Kotlin 中會演變的更加的簡單。

如我們定義一個冪函數的演演算法,

    fun powerAlgorithm(x:Int,power:(a:Int)->Int):Int{
        return  power(x)
    }

至於多少次方,通過power來控制。如我們求三次方:

println(powerAlgorithm(2,{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->x:Int->x*x*x}))

結果列印如下:

I/System.out: 8

再看一個更簡便的寫法:

        var power3 = powerAlgorithm(2){
            it*it*it
        }

這裡有兩點,回撥函數我們可以用另外一個{}中直接編寫,it是一個隱藏的變數。當 lambda 中只有一個引數時,it 就可以用來代表自己。這就是我們一直講的這個it,之前我們還不知道怎麼一回事。

其實這種寫法 kotlin中,我們已經非常的常見了,比如map函數。

map函數,對每個函數做一次同樣的操作,如 對連結串列中的資料 做兩倍的處理:

        var numList:MutableList<Int1> = mutableListOf(1,2,3,4,5)
        var num2 = numList.map{it*2}

這裡的it就是那麼個意思, lambda 中只有一個引數時,it 就可以用來代表自己。

簡化寫法,使用withapply

        tvTest.setText("hello with")
        tvTest.setBackgroundColor(R.color.white)
        with(tvTest){
            setText("hello with")
            setBackgroundColor(R.color.white)
        }
        tvTest.apply {
            setText("hello apply")
            setBackgroundColor(R.color.black)
        }
        var str = HashMap<String,kotlin.Int>().apply {
            this["age"] = 1
            this["num"] = 8
        }

為了避免tvTest 的多處使用,我們集中在with(tvTest) 中使用,同樣的apply 也可以這樣做,apply 可以在變數初始化的時候做,避免重複的變數多寫了很多次。

還有run也是同樣的用法,多了一個功能:最後一行會自動被認為是返回值型別

        var len:kotlin.Int = str.run {
            count()
        }

len的值這時候為2

小結

我們通過了函數的高階特性,知道了一些Kotlin 很好的特性,這些在後面的程式設計中,都起到了很好的作用,我們不需要在寫那麼多的函數,有的時候還找不到函數定義的地方,Lambda 使得 整個的回撥函數看起來非常的簡單,但是如果太熟悉c語言的語法,這可能還重新適應一下。

到此這篇關於Kotlin中Lambda表示式與高階函數使用分析講解的文章就介紹到這了,更多相關Kotlin Lambda與高階函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com