【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )
文章目錄
- I . Lambda 表達式 簡介
- II . Lambda 表達式語法
- III . Lambda 表達式類型
- IV . Lambda 表達式返回值
- V . Lambda 表達式調(diào)用
- VI . Lambda 表達式完整語法示例 ( 聲明 | 實現(xiàn) | 調(diào)用 )
I . Lambda 表達式 簡介
Lambda 表達式 簡介 :
① 作用 : Lambda 表達式可以作為函數(shù)參數(shù) , 傳遞到函數(shù)中 , 使代碼結(jié)構(gòu)更加緊湊 ;
② 應(yīng)用場景 : 集合中擴展集合操作 , 當做函數(shù)參數(shù) , 替代匿名內(nèi)部類 ;
③ 好處 : Lambda 表達式語法簡潔 , 避免了冗長的函數(shù)聲明調(diào)用過程 ;
④ 函數(shù)式編程 : 函數(shù)作為輸入和輸出 ; 在集合操作中 , 過濾 filter , 映射 map 等操作傳入 Lambda 表達式 作為參數(shù) , 很好地體現(xiàn)了函數(shù)式編程思想 ;
II . Lambda 表達式語法
Lambda 表達式 語法 :
{ a : Int, b : Int -> a + b}
① 示例說明 : 上面的代碼示例是 Lambda 表達式的標準形式 , 其參數(shù)列表是 a : Int, b : Int , 在 -> 后面的函數(shù)體中, 可以直接調(diào)用 a 和 b 兩個變量 ;
② 大括號 : Lambda 表達式需要完整的寫在大括號中 , 其參數(shù)列表 , 執(zhí)行代碼 , 返回值 , 都寫在一個大括號 {} 里 ;
③ 參數(shù)列表 : Lambda 表達式的參數(shù)列表 , 定義在 “->” 符號之前 , 格式為 “變量名 : 變量類型” , 多個參數(shù)使用逗號隔開 ;
④ 函數(shù)體 : Lambda 表達式的函數(shù)體可以由 111 行 , 也可以有多行 , 最后一行默認是 Lambda 表達式的返回值 ;
⑤ -> 符號 : 用于分割 參數(shù)列表 與 函數(shù)體 ;
III . Lambda 表達式類型
1 . Lambda 表達式 類型 : 分析下面示例中的 var add : (Int, Int)->Int 變量類型聲明部分 ;
var add : (Int, Int)->Int = { a : Int, b : Int ->println("計算 : a + b = ${a + b}")a + b }
① 變量或常量 : Lambda 表達式可以聲明成變量 var , 也可以聲明成常量 val ;
② 變量 / 常量 名稱 : 符合標識符規(guī)則即可 ;
③ Lambda 表達式參數(shù)列表 : 在括號中 () 表示 , 如果沒有參數(shù) , 括號內(nèi)空著即可 , 如果有多個參數(shù)使用逗號隔開 ;
④ -> 符號 : 在 Lambda 表達式類型中 , 用于分割 參數(shù)列表 和 返回值類型 ;
⑤ Lambda 表達式返回值 : 只允許有一個返回值 , 在 -> 符號之后 , 如果返回值為空 , 記作 Unit ;
2 . Lambda 表達式 類型聲明 示例 :
① 無參數(shù) 空類型返回值 的 Lambda 表達式 類型 : ()->Unit , 無參數(shù) () 內(nèi)空著 , 返回值為空 , 記作 Unit ;
// 無參數(shù) Unit 空類型返回值的 Lambda 表達式 var lambda1 : ()-> Unit = { println("lambda1") }② 單個參數(shù) Int 類型返回值 的 Lambda 表達式 類型 : (Int)->Int , 其參數(shù)是 Int 類型 , 返回值也是 Int 類型的 ;
// Int 類型參數(shù) , Int 類型返回值 , 的 Lambda 表達式 var lambda2 : (Int)-> Int = { a : Int -> a + 1000}③ 多個參數(shù) Int 類型返回值 的 Lambda 表達式 類型 : (Int, Int)->Int , 其有兩個 Int 類型參數(shù) , 使用逗號隔開 ;
// 多個參數(shù)的 Lambda 表達式 var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->println("計算 : a + b = ${a + b}")a + b }④ 使用 Lambda 表達式作為參數(shù) String 返回值類型 的 Lambda 表達式類型 : (Int, Int, (Int, Int)->Int)->Int , 該 Lambda 表達式類型有 333 個參數(shù) , 分別是兩個 Int 和 (Int, Int)->Int , 最后一個參數(shù)的類型是 Lambda 表達式類型 ;
// Lambda 表達式類型作為參數(shù)的 Lambda 表達式 , 第 3 個參數(shù)是 Lambda 表達式類型的參數(shù) var lambda5 : (Int, Int, (Int, Int)->Int)->Int = { a : Int, b : Int, c : (Int, Int)->Int ->println("計算 : a + b = ${c.invoke(a, b)}")c.invoke(a, b) }這里關(guān)于 Unit 空類型說明一下 , 如果沒有參數(shù) , 括號中空著即可 , 如果返回值為空類型 , 必須寫成 Unit 類型的返回值 , 相當于 Java 中的 void 空類型 ;
IV . Lambda 表達式返回值
1 . Lambda 表達式返回值 :
// 多個參數(shù)的 Lambda 表達式 var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->println("計算 : a + b = ${a + b}")a + b }
① 返回值設(shè)置 : Lambda 表達式的返回值是 Lambda 表達式函數(shù)體的最后一行 ;
② 代碼解析 : 如上述代碼 , 其函數(shù)體部分有兩行組成 , 第一行 println("計算 : a + b = ${a + b}") 打印計算公式 , 第二行才是真正的返回值 , 表示返回 a + b 的值 , 作為 Lambda 表達式的返回值 ;
③ 調(diào)用返回值 : 即使用 lambda4.invoke( 1 , 2 ) 或 lambda4 ( 1, 2 ) 調(diào)用 Lambda 表達式 , 返回 1 + 2 = 3 計算結(jié)果 , 最終都返回 3 ;
2 . 返回值類型錯誤 : 注意不要放錯位置 , 如果最后一行的結(jié)果類型 , 與 Lambda 表達式的類型不一致 , 不是 Int 類型的返回值 , 會導致錯誤產(chǎn)生 ; 如下圖示例 , 在最后一行寫成字符串類型 , 編譯時直接報錯 ;
V . Lambda 表達式調(diào)用
1 . Lambda 表達式調(diào)用 : 使用 invoke 方法 , 或直接當做函數(shù)調(diào)用 , 即可調(diào)用 Lambda 表達式 ;
① 直接調(diào)用 : 調(diào)用格式為 “Lambda表達式變量 / 常量 ( 實際參數(shù)列表 )” ;
② invoke 調(diào)用 : 調(diào)用格式為 “Lambda表達式變量 / 常量.invoke( 實際參數(shù)列表 )” ;
2 . Lambda 表達式調(diào)用示例 :
① Lambda 表達式 代碼示例 :
// 4 . 多個參數(shù)的 Lambda 表達式 var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->println("計算 : a + b = ${a + b}")a + b }② Lambda 表達式調(diào)用方法 : 使用 lambda4.invoke(1, 2) 和 lambda4(1, 2) 兩種形式 , 都可以調(diào)用 Lambda 表達式 ;
fun main() {println("${lambda4.invoke(1, 2)}")println("${lambda4(1, 2)}") }③ Lambda 表達式調(diào)用 執(zhí)行結(jié)果 : 兩種調(diào)用方式實現(xiàn)的效果是一樣的 ;
計算 : a + b = 3 3 計算 : a + b = 3 3VI . Lambda 表達式完整語法示例 ( 聲明 | 實現(xiàn) | 調(diào)用 )
Lambda 表達式完整示例 : 下面的示例中 , 分別聲明了 555 種不同類型的 Lambda 表達式示例 , 并使用不同的方法進行調(diào)用 ;
// 1 . 無參數(shù) Unit 空類型返回值的 Lambda 表達式 var lambda1 : ()-> Unit = { println("lambda1") }// 2 . Int 類型參數(shù) , Int 類型返回值 , 的 Lambda 表達式 var lambda2 : (Int)-> Int = { a : Int -> a + 1000}// 3 . 多行代碼的 Lambda 表達式, 最后一行是返回值 var lambda3 : (Int)-> Int = { a : Int ->println("lambda3 多行代碼")a + 1000 }// 4 . 多個參數(shù)的 Lambda 表達式 var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->println("計算 : a + b = ${a + b}")a + b }// 5 . Lambda 表達式類型作為參數(shù)的 Lambda 表達式 , 第 3 個參數(shù)是 Lambda 表達式類型的參數(shù) var lambda5 : (Int, Int, (Int, Int)->Int)->Int = { a : Int, b : Int, c : (Int, Int)->Int ->println("計算 : a + b = ${c.invoke(a, b)}")c.invoke(a, b) }fun main() {//1 . 調(diào)用 無參數(shù) Unit 空類型返回值的 Lambda 表達式 , 分別用兩種形式進行調(diào)用println("\n執(zhí)行 lambda1 調(diào)用 : \n")println("${lambda1.invoke()}")println("${lambda1()}")//2 . Int 類型參數(shù) , Int 類型返回值 , 的 Lambda 表達式println("\n執(zhí)行 lambda2 調(diào)用 : \n")println("${lambda2.invoke(100)}")println("${lambda2(100)}")//3 . 調(diào)用 多行代碼的 Lambda 表達式println("\n執(zhí)行 lambda3 調(diào)用 : \n")println("${lambda3.invoke(200)}")println("${lambda3(200)}")//4 . 調(diào)用 多個參數(shù)的 Lambda 表達式println("\n執(zhí)行 lambda4 調(diào)用 : \n")println("${lambda4.invoke(1, 2)}")println("${lambda4(1, 2)}")//5 . 調(diào)用 Lambda 表達式類型作為參數(shù)的 Lambda 表達式 , 第 3 個參數(shù)是 Lambda 表達式類型的參數(shù)println("\n執(zhí)行 lambda5 調(diào)用 : \n")println("${lambda5.invoke(3 , 4 , lambda4)}")println("${lambda5(3 , 4 , lambda4)}") }
執(zhí)行結(jié)果 :
執(zhí)行 lambda1 調(diào)用 : lambda1 kotlin.Unit lambda1 kotlin.Unit執(zhí)行 lambda2 調(diào)用 : 1100 1100執(zhí)行 lambda3 調(diào)用 : lambda3 多行代碼 1200 lambda3 多行代碼 1200執(zhí)行 lambda4 調(diào)用 : 計算 : a + b = 3 3 計算 : a + b = 3 3執(zhí)行 lambda5 調(diào)用 : 計算 : a + b = 7 計算 : a + b = 7 計算 : a + b = 7 7 計算 : a + b = 7 計算 : a + b = 7 計算 : a + b = 7 7總結(jié)
以上是生活随笔為你收集整理的【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】变量简介 ( 可空类型
- 下一篇: 【Kotlin】函数类型 ( 函数类型