解析kotlin中什么是Lambda?閉包
在 Kotlin 中,Lambda 閉包的本質(zhì)是「將一段代碼作為數(shù)據(jù)傳遞」。
- 核心需求:傳統(tǒng)編程中,函數(shù)只能被調(diào)用,但無(wú)法作為參數(shù)傳遞或返回(如 Java 需用匿名內(nèi)部類實(shí)現(xiàn)回調(diào))。為了讓代碼更靈活(如簡(jiǎn)化回調(diào)邏輯、實(shí)現(xiàn)高階函數(shù)),需要一種「可傳遞的代碼塊」。
- 解決方案:Kotlin 允許將一段代碼封裝成一個(gè)「匿名函數(shù)」(即 Lambda),像變量一樣傳遞給其他函數(shù),或作為函數(shù)的返回值。
通俗類比:
把 Lambda 比作「任務(wù)便簽」:
比如你讓同事幫忙買咖啡(調(diào)用函數(shù)),傳統(tǒng)方式是口頭描述需求(寫死在函數(shù)里),但如果需求復(fù)雜(如不同口味、冰熱要求),就需要寫一張便簽(Lambda),把具體要求(代碼邏輯)寫在上面交給同事。
- 同事(函數(shù))拿到便簽(Lambda)后,按上面的指示執(zhí)行(調(diào)用代碼塊)。例如:
// 定義一個(gè)需要 Lambda 作為參數(shù)的函數(shù)(同事)
fun buyCoffee(action: () -> Unit) {
println("開始買咖啡...")
action() // 執(zhí)行便簽上的代碼(按需求操作)
}
// 創(chuàng)建便簽(Lambda):冰美式去糖
val iceAmericano = { println("加冰,去糖,美式咖啡") }
// 傳遞便簽給同事
buyCoffee(iceAmericano) // 輸出:開始買咖啡... 加冰,去糖,美式咖啡關(guān)鍵特性:
語(yǔ)法簡(jiǎn)潔:
用
{ }包裹代碼塊,參數(shù)可選(如{ name: String -> println(name) }),無(wú)參數(shù)時(shí)可省略箭頭->。
- 當(dāng) Lambda 是函數(shù)最后一個(gè)參數(shù)時(shí),可移到括號(hào)外:
// 傳統(tǒng)寫法
list.forEach({ item -> println(item) })
// 簡(jiǎn)化寫法(更常用)
list.forEach() { item -> println(item) }- 閉包特性:
Lambda 可以訪問(wèn)其外部作用域的變量(如函數(shù)內(nèi)的局部變量),且會(huì)「捕獲」這些變量(即使外部函數(shù)執(zhí)行完畢,Lambda 仍可使用這些變量)。例如:
fun makeGreeting(name: String) {
val age = 18 // 局部變量被 Lambda 捕獲
val greet = { println("Hello, $name! You are $age years old.") }
greet() // 輸出:Hello, Tom! You are 18 years old.
}- 編譯原理:
Lambda 本質(zhì)是函數(shù)對(duì)象(實(shí)現(xiàn)FunctionN接口,N為參數(shù)個(gè)數(shù))。例如無(wú)參數(shù)的 Lambda 對(duì)應(yīng)Function0,一個(gè)參數(shù)的對(duì)應(yīng)Function1。當(dāng)參數(shù)超過(guò) 22 個(gè)時(shí),需手動(dòng)聲明FunctionN接口(如文檔中通過(guò) Java 定義Function23)。
為什么不用匿名內(nèi)部類?
Java 的匿名內(nèi)部類需顯式實(shí)現(xiàn)接口(如 Runnable),代碼冗長(zhǎng),且無(wú)法捕獲可變變量(需用 final 修飾)。Lambda 通過(guò)語(yǔ)法糖簡(jiǎn)化了這一過(guò)程,讓「?jìng)鬟f代碼」更自然,符合「少寫模板代碼」的設(shè)計(jì)原則。
到此這篇關(guān)于kotlin中什么是Lambda 閉包的文章就介紹到這了,更多相關(guān)kotlin Lambda 閉包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)webview實(shí)例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)webview實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Android使用Kotlin實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android使用Kotlin實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解
這篇文章主要為大家介紹了Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android自定義View實(shí)現(xiàn)動(dòng)畫效果詳解
這篇文章主要為大家詳細(xì)介紹了Android如何通過(guò)自定義View實(shí)現(xiàn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡(jiǎn)潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01
Java Base64位編碼與String字符串的相互轉(zhuǎn)換,Base64與Bitmap的相互轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了Java Base64位編碼與String字符串的相互轉(zhuǎn)換,Base64與Bitmap的相互轉(zhuǎn)換實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
Android里實(shí)現(xiàn)退出主程序的提示代碼
當(dāng)用戶選擇"確定",就退出當(dāng)前的對(duì)話框。其中,有個(gè)很重要的函數(shù),Activity.finish(),通過(guò)調(diào)用這個(gè)函數(shù),退出當(dāng)前運(yùn)行的整個(gè)Android程序2013-06-06
Kotlin語(yǔ)言中CompileSdkVersion與targetSdkVersion的區(qū)別淺析
這篇文章主要介紹了Kotlin語(yǔ)言中CompileSdkVersion和targetSdkVersion有什么區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02

