函數(shù)字面量
函數(shù)字面量有的也叫函數(shù)字面值,所謂字面量,就是不用變量直接用文本寫出,比如:”hello 你好“、"12345"等都是字面量。我們可有將這些字面量賦值給常量或者變量。
val str: String = "hello 你好"
val str1: String = "12345"
函數(shù)也可以有字面量,比如:
{
println("hello 最近好嗎周杰倫")
}
與所有字面量一致,它也可以賦值給一個變量:
val show = {
println("hello 最近好嗎周杰倫")
}
這個函數(shù)字面量只有一條語句,那么怎么調(diào)用它呢?其實跟常見函數(shù)一致,直接看如下例子:
fun main(args: Array<String>) {
show()
}
val show = {
println("hello 最近好嗎周杰倫")
}
結(jié)果:
hello 最近好嗎周杰倫
是不是很簡單呀。既然跟常見函數(shù)一樣,那么怎么傳遞參數(shù)呢?我們改寫下代碼:
fun main(args: Array<String>) {
show("hello 最近好嗎周杰倫!!!!")
}
val show = {
msg:String -> println(msg)
}
結(jié)果:
hello 最近好嗎周杰倫!!!!
它的函數(shù)調(diào)用跟有參函數(shù)是不是一樣啊。
注意:
->在此處指代后面語句為執(zhí)行語句-
編譯器會做類型推斷,可有省略參數(shù)類型如:msg -> println(msg)
函數(shù)字面量其實就是函數(shù)的簡寫,主要用于高階函數(shù),后面的學(xué)習(xí)中我們會大量使用。
閉包Clousure
閉包是Kotlin語言的眾多特性之一,對多數(shù)習(xí)慣使用了Java語言的開發(fā)者來說是一個很難理解的東西(實際上Java8也開始支持閉包特性),Kotlin中的閉包是一個功能性自包含模塊,可以再代碼中被當(dāng)做參數(shù)傳遞或者直接使用。
一段程序代碼通常由常量、變量和表達式組成,然后使用一對花括號“{}”來表示閉合,并包裹著這些代碼,由這對花括號包裹著的代碼塊就是一個閉包。
kotlin閉包與java 8 閉包不同,具有如下特點:
- 它是運行的環(huán)境
- 它持有函數(shù)的運行狀態(tài)
- 它的內(nèi)部可以定義函數(shù)
- 它的內(nèi)部也可以定義類
是不是看的稀里糊涂啊,沒關(guān)系我們看代碼,只要會用就行:
fun getNum(): () -> Unit {
var a = 0
return fun() {
a++
println(a)
}
}
fun main(args: Array<String>) {
val num = getNum()
num()
num()
num()
}
結(jié)果:
1
2
3
例子是不是看不懂啊。
fun getNum(): () -> Unit{}
我們定義了一個函數(shù),返回值是函數(shù)。
冒號后面的"()"表示 函數(shù)返回的時一個函數(shù),()里面可以寫參數(shù), ()后面是函數(shù)的返回值類型,->后面跟返回值類型,為空的時候也必須寫Unit,不可以省略。
自執(zhí)行閉包
就是在定義閉包的同時直接執(zhí)行閉包,一般用于初始化。
fun main(args: Array<String>) {
val num = { x: Int, y: Int ->
x+y
}(2,9)
println(num.absoluteValue)
}
結(jié)果:11
閉包其實是函數(shù)式編程的特點,函數(shù)式編程又博大精深,對閉包還不太了解的同學(xué),可以多學(xué)習(xí)學(xué)習(xí)關(guān)于閉包的知識,我在學(xué)習(xí)閉包的過程中就摩拜過幾位大神的博客。在這里可以推薦給大家共勉。