日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Kotlin中Lambda表達(dá)式與高階函數(shù)使用分析講解_Android

作者:go2coding ? 更新時(shí)間: 2023-01-03 編程語言

編程語言的發(fā)展,通過需求,不斷的變化出新的特性,而這些特性就會(huì)使得編程變得更加的簡(jiǎn)潔。

Lambda表達(dá)式

Lambda表達(dá)式的出現(xiàn),一定程度上使得函數(shù)和變量慢慢的融為一體,這樣做的好處大大的方便了回調(diào)函數(shù)的使用。

在很多的情況下,其實(shí)我們的函數(shù)就只有簡(jiǎn)單的幾行代碼,用fun就感覺有點(diǎn)重了,而且有的時(shí)候這么大的函數(shù)結(jié)構(gòu)用起來,并不是非常的方便。

Lambda表達(dá)式,其表達(dá)式為:?{變量定義 -> 代碼塊}

其中:

lambda 函數(shù)是一個(gè)可以接收任意多個(gè)參數(shù)(包括可選參數(shù))并且返回單個(gè)表達(dá)式值的函數(shù)

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

通常對(duì)于求和的代碼,不過是普通的幾句代碼,如果定義一個(gè)函數(shù)會(huì)有點(diǎn)麻煩,這里把函數(shù) 看成一個(gè)變量,后面我們就可以知道這種寫法的威力。

Lambda表達(dá)式 中,使用(Int,Int) -> Int 來定義變量的類型,也就是函數(shù)的類型了。當(dāng)然這一個(gè)Lambda表達(dá)式 可以簡(jiǎn)化為:

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

-> 符號(hào)代表的是,參數(shù)到返回值。

高階函數(shù)

函數(shù)中帶有以函數(shù)為參數(shù),就稱為高階函數(shù),在c語言中,通常是以函數(shù)指針傳遞給函數(shù)參數(shù),在Kotlin 中會(huì)演變的更加的簡(jiǎn)單。

如我們定義一個(gè)冪函數(shù)的算法,

    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}))

結(jié)果打印如下:

I/System.out: 8

再看一個(gè)更簡(jiǎn)便的寫法:

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

這里有兩點(diǎn),回調(diào)函數(shù)我們可以用另外一個(gè){}中直接編寫,it是一個(gè)隱藏的變量。當(dāng) lambda 中只有一個(gè)參數(shù)時(shí),it 就可以用來代表自己。這就是我們一直講的這個(gè)it,之前我們還不知道怎么一回事。

其實(shí)這種寫法 kotlin中,我們已經(jīng)非常的常見了,比如map函數(shù)。

map函數(shù),對(duì)每個(gè)函數(shù)做一次同樣的操作,如 對(duì)鏈表中的數(shù)據(jù) 做兩倍的處理:

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

這里的it就是那么個(gè)意思, lambda 中只有一個(gè)參數(shù)時(shí),it 就可以用來代表自己。

簡(jiǎn)化寫法,使用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 可以在變量初始化的時(shí)候做,避免重復(fù)的變量多寫了很多次。

還有run也是同樣的用法,多了一個(gè)功能:最后一行會(huì)自動(dòng)被認(rèn)為是返回值類型

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

len的值這時(shí)候?yàn)?

小結(jié)

我們通過了函數(shù)的高級(jí)特性,知道了一些Kotlin 很好的特性,這些在后面的編程中,都起到了很好的作用,我們不需要在寫那么多的函數(shù),有的時(shí)候還找不到函數(shù)定義的地方,Lambda 使得 整個(gè)的回調(diào)函數(shù)看起來非常的簡(jiǎn)單,但是如果太熟悉c語言的語法,這可能還重新適應(yīng)一下。

原文鏈接:https://blog.csdn.net/weixin_40425640/article/details/127878091

欄目分類
最近更新