Kotlin中Lambda表達(dá)式與高階函數(shù)使用分析講解
編程語(yǔ)言的發(fā)展,通過(guò)需求,不斷的變化出新的特性,而這些特性就會(huì)使得編程變得更加的簡(jiǎn)潔。
Lambda表達(dá)式
Lambda表達(dá)式的出現(xiàn),一定程度上使得函數(shù)和變量慢慢的融為一體,這樣做的好處大大的方便了回調(diào)函數(shù)的使用。
在很多的情況下,其實(shí)我們的函數(shù)就只有簡(jiǎn)單的幾行代碼,用fun就感覺(jué)有點(diǎn)重了,而且有的時(shí)候這么大的函數(shù)結(jié)構(gòu)用起來(lái),并不是非常的方便。
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ì)于求和的代碼,不過(guò)是普通的幾句代碼,如果定義一個(gè)函數(shù)會(huì)有點(diǎn)麻煩,這里把函數(shù) 看成一個(gè)變量,后面我們就可以知道這種寫(xiě)法的威力。
Lambda表達(dá)式 中,使用(Int,Int) -> Int 來(lái)定義變量的類(lèi)型,也就是函數(shù)的類(lèi)型了。當(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ù),就稱(chēng)為高階函數(shù),在c語(yǔ)言中,通常是以函數(shù)指針傳遞給函數(shù)參數(shù),在Kotlin 中會(huì)演變的更加的簡(jiǎn)單。
如我們定義一個(gè)冪函數(shù)的算法,
fun powerAlgorithm(x:Int,power:(a:Int)->Int):Int{
return power(x)
}至于多少次方,通過(guò)power來(lái)控制。如我們求三次方:
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)便的寫(xiě)法:
var power3 = powerAlgorithm(2){
it*it*it
}
這里有兩點(diǎn),回調(diào)函數(shù)我們可以用另外一個(gè){}中直接編寫(xiě),it是一個(gè)隱藏的變量。當(dāng) lambda 中只有一個(gè)參數(shù)時(shí),it 就可以用來(lái)代表自己。這就是我們一直講的這個(gè)it,之前我們還不知道怎么一回事。
其實(shí)這種寫(xiě)法 kotlin中,我們已經(jīng)非常的常見(jiàn)了,比如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 就可以用來(lái)代表自己。
簡(jiǎn)化寫(xiě)法,使用with和apply。
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ù)的變量多寫(xiě)了很多次。
還有run也是同樣的用法,多了一個(gè)功能:最后一行會(huì)自動(dòng)被認(rèn)為是返回值類(lèi)型
var len:kotlin.Int = str.run {
count()
}len的值這時(shí)候?yàn)?
小結(jié)
我們通過(guò)了函數(shù)的高級(jí)特性,知道了一些Kotlin 很好的特性,這些在后面的編程中,都起到了很好的作用,我們不需要在寫(xiě)那么多的函數(shù),有的時(shí)候還找不到函數(shù)定義的地方,Lambda 使得 整個(gè)的回調(diào)函數(shù)看起來(lái)非常的簡(jiǎn)單,但是如果太熟悉c語(yǔ)言的語(yǔ)法,這可能還重新適應(yīng)一下。
到此這篇關(guān)于Kotlin中Lambda表達(dá)式與高階函數(shù)使用分析講解的文章就介紹到這了,更多相關(guān)Kotlin Lambda與高階函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android初學(xué)者必須知道的10個(gè)技術(shù)
本篇內(nèi)容給大家整理10個(gè)作為Android初學(xué)者必須要了解和會(huì)用的技術(shù)以及詳細(xì)代碼分析,需要的朋友收藏下慢慢學(xué)習(xí)吧。2017-12-12
詳解Android中常見(jiàn)的內(nèi)存優(yōu)化及內(nèi)存泄露場(chǎng)景
本文主要給大家介紹了Android中常見(jiàn)的內(nèi)存優(yōu)化及Android開(kāi)發(fā)中容易造成內(nèi)存泄露的場(chǎng)景,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08
kotlin使用Dagger2的過(guò)程全紀(jì)錄
Dagger2是一款基于Java注解,在編譯階段完成依賴(lài)注入的開(kāi)源庫(kù),主要用于模塊間解耦,方便進(jìn)行測(cè)試。下面這篇文章主要給大家介紹了關(guān)于kotlin使用Dagger2的過(guò)程的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度
本篇文章主要介紹了Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android 下載并打開(kāi)PDF,Doc,Dwg文檔實(shí)例
本篇文章主要介紹了Android 下載并打開(kāi)PDF,Doc,Dwg文檔實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04
android實(shí)現(xiàn)動(dòng)態(tài)顯隱進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)動(dòng)態(tài)顯隱進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Android中SwipeBack實(shí)現(xiàn)右滑返回效果
這篇文章主要介紹了Android中SwipeBack實(shí)現(xiàn)右滑返回效果的相關(guān)資料,需要的朋友可以參考下2016-02-02

