一、函數
代碼塊函數體:
fun sum(x: Int, y: Int): Int {
return x + y
}
表達式函數體:
fun sum(x: Int, y: Int) = x + y
使用表達式函數體,一般情況下可以不聲明返回值類型。在一些諸如遞歸等複雜情況下,即使是使用表達式函數體,也必須顯示聲明返回值類型。
總結:
- 函數參數必須顯示聲明類型
- 非表達式函數體,函數參數必須顯示聲明類型, 返回值除了類型是 Unit,可以省略,其它情況,返回值都必須顯示聲明類型
- 如果它是一個遞歸的函數,必須顯示聲明參數和返回值類型
- 如果它是一個公有方法,爲了代碼的可讀性,儘量顯示聲明函數參數和返回值類型
二、函數類型
Kotlin 中,函數類型的格式如下:
() -> Unit
Kotlin 中,函數類型聲明必須遵循以下幾點:
- 通過 -> 符號來組織參數類型和返回值類型。左邊是參數類型,右邊是返回值類型
- 必須用一個括號來包裹參數類型
- 返回值類型即使是 Unit, 也必須顯示聲明。
使用::
對某個類的方法進行引用,比如:
class A {
fun test()
}
我們可以使用如下方式保持對 test() 方法的引用
val a = A () // 創建類的對象
val f = a::test // 通過對象引用方法
f.invike() // 調用方法
三、lambda 表達式
val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y}
由於支持類型推導,可以簡化爲
val sum: (Int, Int) -> Int = {x, y -> x + y}
或者:
val sum = {x: Int, y: Int -> x + y}
lambda 表達式語法:
- lambda 表達式必須通過 {} 來包裹
- 如果 lambda 聲明瞭參數部分的類型,且返回值支持類型推導,則 lambda 表達式變量就可以省略函數類型聲明
- 如果 lambda 變量聲明瞭函數類型,那麼 lambda 表達式的參數部分的類型就可以省略
- 如果 lambda 表達式返回的不是 Unit 類型,則默認最後一行表達式的值類型就是返回值類型。
函數 和 lambda表達式
- fun 在沒有等號、只有花括號的情況下,就是代碼塊函數體,如果返回值非 Unit,必須帶 return
fun foo(x: Int) {
print(x)
}
fun foo(x: Int, y: Int): Int {
return x + y
}
- fun 帶有等號,沒有花括號,是單表達式函數體,可以省略 return
fun foo(x: Int, y: Int) = x + y
- 不管是用 val 還是 fun 聲明,如果是等號加花括號的語法,就是聲明一個 lambda 表達式。
val foo = { x: Int, y: Int ->
x + y
}
// 調用方式: foo.invoke(1, 2) 或者 foo(1, 2)
fun foo(x: Int) = { y: Int ->
x + y
}
// 調用方式: foo(1).invoke(2) 或者 foo(1)(2)
- lambda 表達式自調用
{x: Int, y: Int -> x + y}(1, 2)