Kotlin語法(函式和lambda表示式)

2021-09-22 07:15:07 字數 1988 閱讀 4459

fun double(x: int): int
函式引數是用 pascal 符號定義的 name:type。引數之間用逗號隔開,每個引數必須指明型別。函式引數可以有預設引數。這樣相比其他語言可以減少過載。

fun read(b: array, off: int = 0, len: int = b.size() )
在呼叫函式時可以引數可以命名。這對於有很多引數或只有乙個的函式來說很方便。

fun reformat(str: string, normalizecase: boolean = true,uppercasefirstletter: boolean = true,

dividebycamelhumps: boolean = false,

wordseparator: char = ' ')

reformat(str,

normalizecase = true,

uppercasefirstletter = true,

dividebycamelhumps = false,

wordseparator = '_'

)

fun aslist(vararg ts: t): list
傳遞乙個 array 的內容給函式,我們就可以使用 * 字首操作符:

val a = array(1, 2, 3)

val list = aslist(-1, 0, *a, 4)

kotlin 中可以在檔案個根級宣告函式,這就意味者你不用建立乙個類來持有函式。除了頂級函式,kotlin 函式可以宣告為區域性的,作為成員函式或擴充套件函式。

kotlin 支援區域性函式,比如在另乙個函式使用另一函式。區域性函式可以訪問外部函式的區域性變數(比如閉包)。區域性函式甚至可以返回到外部函式

高階函式就是可以接受函式作為引數並返回乙個函式的函式。比如 lock() 就是乙個很好的例子,它接收乙個 lock 物件和乙個函式,執行函式並釋放 lock;

fun lock

(lock: lock, body: () -> t ) : t

finally

}

其實最方便的辦法是傳遞乙個字面函式(通常是 lambda 表示式):

val result = lock(lock, )
在 kotlin 中有乙個約定,如果最後乙個引數是函式,可以省略括號:

lock (lock)
字面函式或函式表示式就是乙個 "匿名函式",也就是沒有宣告的函式,但立即作為表示式傳遞下去。

如:(t, t) -> boolean

注意如果乙個函式接受另乙個函式做為最後乙個引數,該函式文字引數可以在括號內的引數列表外的傳遞。

函式文字的完全寫法是下面這樣的:

val sum =
函式文字總是在大括號裡包裹著,在完全語法中引數宣告是在括號內,型別註解是可選的,函式體是在 -> 之後,像下面這樣:

val sum: (int, int) -> int =
fun(x: int, y: int ): int = x + y
在高階函式前增加inline註解可以指定函式內聯。inline 標記即影響函式本身也影響傳遞進來的 lambda 函式:所有的這些都將被關聯到呼叫點。

內聯可能會引起生成**增長,所以可以使用noinline來指定某些函式不進行內聯。

注意有些內聯函式可以呼叫傳遞進來的 lambda 函式,但不是在函式體,而是在另乙個執行的上下文中,比如區域性物件或者乙個巢狀函式。在這樣的情形中,非區域性的控制流也不允許在lambda 函式中。為了表明,lambda 引數需要有 inlineoptions.only_local_return 註解

參考:

C 委託,delegate,匿名函式和lambda

1委託就是可以把方法當作引數傳遞 2可以把委託看作乙個類來使用 3委託使用前需要例項化 using system using system.collections.generic using system.linq using system.text private void button1 cli...

Kotlin語法之變數和函式的定義

方法的定義,a,b為變數名 fun 方法名 變數名 變數型別 返回值型別 fun sum a int,b int int 當表示式作為函式體的時候,可以省去返回值型別 由函式自己推斷 fun sum1 a int,b int a b 當不需要返回值型別的時候可以宣告為unit,也可以省略 fun p...

Kotlin語法(函式和lambda表示式)

fun double x int int函式引數是用 pascal 符號定義的 name type。引數之間用逗號隔開,每個引數必須指明型別。函式引數可以有預設引數。這樣相比其他語言可以減少過載。fun read b array,off int 0,len int b.size 在呼叫函式時可以引數...