一 函數類型定義
1 定義
函數類型就是 (Int, Int) -> Int
函數類型其實就是將函數的 “參數類型” 和 “返回值類型” 抽象出來
2 示例 :
(Int, Int) -> Int 表示接收兩個 Int 參數并返回 Int 的函數類型;
(String) -> Unit 表示接收 String 參數且無返回值的函數類型空 。
3 函數類型定義(補充)
-
基本形式:
(Int, Int) -> Int
表示接收兩個Int
參數并返回Int
的函數類型。(String) -> Unit
表示接收String
參數但無返回值的函數類型(Unit
表示無返回值)。
-
特殊情況:
- 無參數的函數:
() -> String
(無參數,返回String
)。 - 返回值是函數的函數類型:
(Int) -> (Int) -> Int
(接收Int
,返回一個(Int) -> Int
類型的函數)。 - 可空的函數類型:
((Int, Int) -> Int)?
(函數類型可為null
)。
- 無參數的函數:
-
函數類型的變量:
val sum: (Int, Int) -> Int = { a, b -> a + b } val printMessage: (String) -> Unit = { message -> println(message) }
二 Lambda 表達式
1 語法結構
{ 參數列表 -> 函數體 }
2 示例
示例:{ x: Int, y: Int -> x + y }
{a1:Int,b1:Int->a1+b1}
3 Lambda 表達式(補充)
-
省略參數類型(Kotlin 可以類型推導):
val sum = { a: Int, b: Int -> a + b } // 顯式聲明參數類型 val sum2: (Int, Int) -> Int = { a, b -> a + b } // 省略參數類型
-
單個參數時,使用
it
(當 Lambda 只有一個參數時,it
代表該參數):val square: (Int) -> Int = { it * it } // `it` 代表傳入的參數 println(square(5)) // 輸出 25
-
Lambda 作為參數傳遞:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {return op(a, b) }val result = operate(3, 4) { x, y -> x * y } println(result) // 輸出 12
-
Lambda 作為函數返回值:
fun getOperator(): (Int, Int) -> Int {return { x, y -> x + y } }val add = getOperator() println(add(10, 5)) // 輸出 15
三、高階函數
高階函數 指的是 接受函數類型作為參數或返回值的函數。
示例:
fun highOrderFunction(operation: (Int, Int) -> Int): Int {return operation(10, 20)
}val result = highOrderFunction { a, b -> a + b }
println(result) // 輸出 30
總結
- 函數類型的特殊情況(無參數、返回值是函數、可空類型)。
- Lambda 表達式的簡化寫法(省略參數類型、
it
關鍵字)。 - Lambda 作為參數和返回值。
- 高階函數(函數可以接收 Lambda 作為參數)。
四 函數體
在 Kotlin 中,函數體(Function Body) 是定義函數具體行為的代碼塊,即 {}
大括號中的內容。它包含了函數要執行的邏輯和操作,具體分為兩種形式:
1. 代碼塊函數體(Block Body)
當函數需要執行多行邏輯時使用,必須顯式聲明返回值(如果有返回值)。
// 完整函數體(包含 return)
fun add(a: Int, b: Int): Int {val sum = a + breturn sum
}// 無返回值的函數(Unit 可省略)
fun printMessage(message: String) {println("Message: $message")
}
2. 單表達式函數體(Single-Expression Body)
當函數可以通過單個表達式完成時,可省略 {}
并用 =
直接返回結果,編譯器會自動推導返回值類型。
// 等價于代碼塊函數體,但更簡潔
fun add(a: Int, b: Int) = a + b// 配合 when 表達式
fun getTypeName(type: Int) = when(type) {1 -> "A/C"2 -> "Heater"else -> "Unknown"
}
關鍵區別
特性 | 代碼塊函數體 | 單表達式函數體 |
---|---|---|
語法 | 用 {} 包裹 | 用 = 連接表達式 |
返回值 | 必須顯式 return | 自動返回表達式結果 |
類型推導 | 需顯式聲明返回值類型 | 可省略返回值類型聲明 |
適用場景 | 多行邏輯、復雜操作 | 簡單計算、條件判斷 |
注意事項
? 類型推導限制:單表達式函數體僅在邏輯簡單時可自動推導類型,復雜邏輯仍需顯式聲明。
? 作用域:代碼塊函數體中定義的變量(如示例中的 sum
)僅在函數體內可見。
? 空函數體:無實際操作的函數可以留空 {}
,但需聲明返回類型為 Unit
(可省略)。
如果在 Android 開發中遇到函數體相關的具體問題(如事件回調的 lambda 簡化寫法等),可以進一步探討!
五 省略參數列表情況
在 Kotlin 中,當 Lambda 表達式只有一個參數時,可以省略參數列表,直接使用 it
關鍵字來引用這個唯一的參數。
你的代碼:
val square: (Int) -> Int = { it * it }
實際上等價于:
val square: (Int) -> Int = { x -> x * x }
這里 x
是 Lambda 的唯一參數。
為什么可以省略參數列表?
原因:
Kotlin 允許在 只有一個參數 的 Lambda 表達式中,使用 it
作為默認參數名稱,省略顯式聲明。
規則:
-
如果 Lambda 只有一個參數,就可以用
it
代替參數列表:val printMessage: (String) -> Unit = { println(it) } printMessage("Hello") // 輸出 Hello
相當于:
val printMessage: (String) -> Unit = { message -> println(message) }
-
如果 Lambda 有多個參數,就必須顯式聲明參數列表:
val sum: (Int, Int) -> Int = { a, b -> a + b } // 必須寫參數名
不能寫成
{ it + it }
,因為 Kotlin 無法知道it
代表哪一個參數。
示例:省略參數 vs 顯式參數
// 只有一個參數,使用 it
val double: (Int) -> Int = { it * 2 }
println(double(5)) // 輸出 10// 兩個參數,必須顯式聲明
val add: (Int, Int) -> Int = { a, b -> a + b }
println(add(3, 4)) // 輸出 7
結論:
? it
適用于單參數 Lambda,當 Lambda 只有一個參數時,可以省略參數列表,直接用 it
代替。
? 多參數 Lambda 不適用 it
,必須顯式定義參數列表。
這樣寫代碼更簡潔,減少不必要的參數命名,讓 Lambda 表達式更加直觀!