Kotlin 函式 與 lambda 表示式

2022-09-15 00:09:29 字數 1923 閱讀 6511

**塊函式體:

fun sum(x: int, y: int): int
表示式函式體:

fun sum(x: int, y: int) = x + y
使用表示式函式體,一般情況下可以不宣告返回值型別。在一些諸如遞迴等複雜情況下,即使是使用表示式函式體,也必須顯示宣告返回值型別。

總結:

函式引數必須顯示宣告型別

非表示式函式體,函式引數必須顯示宣告型別, 返回值除了型別是 unit,可以省略,其它情況,返回值都必須顯示宣告型別

如果它是乙個遞迴的函式,必須顯示宣告引數和返回值型別

如果它是乙個公有方法,為了**的可讀性,盡量顯示宣告函式引數和返回值型別

kotlin 中,函式型別的格式如下:

() -> unit
kotlin 中,函式型別宣告必須遵循以下幾點:

通過 -> 符號來組織引數型別和返回值型別。左邊是引數型別,右邊是返回值型別

必須用乙個括號來包裹引數型別

返回值型別即使是 unit, 也必須顯示宣告。

使用::對某個類的方法進行引用,比如:

class a
我們可以使用如下方式保持對 test() 方法的引用

val a = a () // 建立類的物件

val f = a::test // 通過物件引用方法

f.invike() // 呼叫方法

val sum: (int, int) -> int =
由於支援型別推導,可以簡化為

val sum: (int, int) -> int =
或者:

val sum =
lambda 表示式語法:

lambda 表示式必須通過 {} 來包裹

如果 lambda 宣告了引數部分的型別,且返回值支援型別推導,則 lambda 表示式變數就可以省略函式型別宣告

如果 lambda 變數宣告了函式型別,那麼 lambda 表示式的引數部分的型別就可以省略

如果 lambda 表示式返回的不是 unit 型別,則預設最後一行表示式的值型別就是返回值型別。

函式 和 lambda表示式

fun 在沒有等號、只有花括號的情況下,就是**塊函式體,如果返回值非 unit,必須帶 return

fun foo(x: int) 

fun foo(x: int, y: int): int

fun 帶有等號,沒有花括號,是單表示式函式體,可以省略 return

fun foo(x: int, y: int) = x + y
不管是用 val 還是 fun 宣告,如果是等號加花括號的語法,就是宣告乙個 lambda 表示式。

val foo = 

// 呼叫方式: foo.invoke(1, 2) 或者 foo(1, 2)

fun foo(x: int) = 

// 呼叫方式: foo(1).invoke(2) 或者 foo(1)(2)

lambda 表示式自呼叫

(1, 2)

關於Kotlin擴充套件函式與lambda的上下文

通常我們在寫乙個擴充套件函式,如果傳入乙個lambda表示式大概是下面這樣 inline fun block unit 複製 這個時候它的上下文是誰呢?在擴充套件的方法內部,這個方法的上下文其實就是這個t,也就是呼叫這個方法的物件,所以this t,這一點很明顯。那麼在外部使用的時候,如下 中呢?這...

Kotlin學習系列 函式,Lambda表示式

函式 kotlin中,使用fun關鍵字定義乙個函式,函式引數使用 pascal 表示法定義,即 name type。引數用逗號隔開。每個引數必須有顯式型別。fun foo arg1 string,arg2 boolean,arg3 int int 當函式只有單個表示式時,可以省略花括號,直接寫在 之...

Kotlin學習筆記(九)函式,Lambda表示式

函式 kotlin中,使用fun關鍵字定義乙個函式,函式引數使用 pascal 表示法定義,即 name type。引數用逗號隔開。每個引數必須有顯式型別。fun foo arg1 string,arg2 boolean,arg3 int int當函式只有單個表示式時,可以省略花括號,直接寫在 之後...