Kotlin 函數 與 lambda 表達式

一、函數

代碼塊函數體:

fun sum(x: Int, y: Int): Int {
    return x + y
}

表達式函數體:

fun sum(x: Int, y: Int) = x + y

使用表達式函數體,一般情況下可以不聲明返回值類型。在一些諸如遞歸等複雜情況下,即使是使用表達式函數體,也必須顯示聲明返回值類型。

總結:

  1. 函數參數必須顯示聲明類型
  2. 非表達式函數體,函數參數必須顯示聲明類型, 返回值除了類型是 Unit,可以省略,其它情況,返回值都必須顯示聲明類型
  3. 如果它是一個遞歸的函數,必須顯示聲明參數和返回值類型
  4. 如果它是一個公有方法,爲了代碼的可讀性,儘量顯示聲明函數參數和返回值類型

二、函數類型

Kotlin 中,函數類型的格式如下:

() -> Unit

Kotlin 中,函數類型聲明必須遵循以下幾點:

  1. 通過 -> 符號來組織參數類型和返回值類型。左邊是參數類型,右邊是返回值類型
  2. 必須用一個括號來包裹參數類型
  3. 返回值類型即使是 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 表達式語法:

  1. lambda 表達式必須通過 {} 來包裹
  2. 如果 lambda 聲明瞭參數部分的類型,且返回值支持類型推導,則 lambda 表達式變量就可以省略函數類型聲明
  3. 如果 lambda 變量聲明瞭函數類型,那麼 lambda 表達式的參數部分的類型就可以省略
  4. 如果 lambda 表達式返回的不是 Unit 類型,則默認最後一行表達式的值類型就是返回值類型。

函數 和 lambda表達式

  1. fun 在沒有等號、只有花括號的情況下,就是代碼塊函數體,如果返回值非 Unit,必須帶 return
fun foo(x: Int) {
    print(x)
}

fun foo(x: Int, y: Int): Int {
    return x + y
}
  1. fun 帶有等號,沒有花括號,是單表達式函數體,可以省略 return
fun foo(x: Int, y: Int) = x + y
  1. 不管是用 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)
  1. lambda 表達式自調用
{x: Int, y: Int -> x + y}(1, 2)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章