一焚虱、函數(shù)類型
在 Kotlin 里,有一類 Java 中不存在的類型懂版,叫做「函數(shù)類型」鹃栽,這一類類型的對象在可以當(dāng)函數(shù)來用的同時,還能作為函數(shù)的參數(shù)躯畴、函數(shù)的返回值以及賦值給變量
所有函數(shù)類型都有一個圓括號括起來的參數(shù)類型列表以及一個返回類型:
(A, B) -> C
表示接受類型分別為A
與B
兩個參數(shù)并返回一個C
類型值的函數(shù)類型民鼓。 參數(shù)類型列表可以為空,如() -> A
蓬抄。返回類型為空 Unit 不能省略丰嘉。
//樣式
(參數(shù)列表類型) -> 返回值類型
//比如,定義一個函數(shù)類型的變量
val sum: (Int) -> Int
//方法中定義 函數(shù)類型參數(shù)
fun test(age: Int, action: (Int) -> String) {}
如需將函數(shù)類型指定為可空嚷缭,使用圓括號:((Int, Int) -> Int)?
饮亏。
函數(shù)類型可以使用圓括號進行接合:(Int) -> ((Int) -> Unit)
箭頭表示法是右結(jié)合的,(Int) -> (Int) -> Unit
與前述示例等價阅爽,但不等于 ((Int) -> (Int)) -> Unit
路幸。
二、函數(shù)類型實例化
//1.lambda表達式
val sum = { a: Int, b: Int -> a + b }
//2.匿名函數(shù)
val sum1 = fun(a: Int, b: Int) { a + b }
//3.雙冒號付翁,函數(shù)引用
fun sumab(a: Int, b: Int): Int {
return a + b
}
val sum2 = ::sumab
三简肴、lambda表達式
1.基本形式
組成結(jié)構(gòu)
//例如調(diào)用上面方法,傳入lambda表達式百侧,內(nèi)部會 自動創(chuàng)建對應(yīng)的對象
test(12, { it -> "aa" })
2.基本使用
//方法中定義砰识,需要傳入 函數(shù)類型 的參數(shù)
fun test(age: Int, action: (Int) -> String) {
val result = action(age)
println(result)
}
//使用此方法
test(12, { it -> "aa" })
3.語法簡化
login.setOnClickListener({ v: View ->
//doSomething
})
//如果Lambda為最后一個參數(shù),可以放到括號外面
login.setOnClickListener() { v: View ->
//doSomething
}
//lambda是setOnClickListener 單參數(shù)佣渴,括號省略
login.setOnClickListener { v: View ->
//doSomething
}
//lambda表達式中參數(shù)只有一個辫狼,參數(shù)省略,如果需要使用辛润,it代替
login.setOnClickListener {
//doSomething
}
四予借、匿名函數(shù)
//賦值給變量
val add = fun(a: Int, b: Int): Int { return a + b }
val multiply = fun(a: Int, b: Int): Int { return a * b }
fun calculate(action: (Int, Int) -> Int): Int {
val a = 1
val b = 2
return action(a, b)
}
fun main() {
println(calculate(add))
println(calculate(multiply))
}
或者直接在參數(shù)里創(chuàng)建一個 匿名函數(shù)
calculate(fun(a: Int, b: Int): Int { return a + b })
1
五、函數(shù)引用
//定義一個普通函數(shù)/方法
fun cc(a: Int, b: Int): Int {
return a + b
}
fun main() {
//用雙冒號創(chuàng)建一個函數(shù)類型的對象
val ccInstance = ::cc
cc(1, 2) //直接調(diào)用函數(shù)
ccInstance(1,2) //用賦值的變量調(diào)用
(::cc)(1, 2) //對象 ::cc 調(diào)用,和上面等價
}
對于有相同變量名的重載方法灵迫,需要顯示指明變量的函數(shù)類型才行
fun cc(a: Int, b: Int): Int {
return a + b
}
fun cc(a: Int, b: Int, c:Int): Int {
return a + b + c
}
fun main() {
//顯示指明變量具體的函數(shù)類型
val ccInstance1 : (Int, Int) -> Int = ::cc
val ccInstance2 : (Int, Int, Int) -> Int = ::cc
}