基礎(chǔ)語(yǔ)法
無(wú)參數(shù)的情況 :
val/var 變量名 = { 操作的代碼 }有參數(shù)的情況
val/var 變量名 : (參數(shù)的類型,參數(shù)類型,...) -> 返回值類型 = {參數(shù)1,參數(shù)2,... -> 操作參數(shù)的代碼 }可等價(jià)于
// 此種寫法:即表達(dá)式的返回值類型會(huì)根據(jù)操作的代碼自推導(dǎo)出來(lái)。
val/var 變量名 = { 參數(shù)1 : 類型,參數(shù)2 : 類型, ... -> 操作參數(shù)的代碼 }
- lambda表達(dá)式作為函數(shù)中的參數(shù)的時(shí)候,這里舉一個(gè)例子:
fun test(a : Int, 參數(shù)名 : (參數(shù)1 : 類型,參數(shù)2 : 類型, ... ) -> 表達(dá)式返回類型){
...
}
例
源碼
// 傳入兩個(gè) int 值,返回之和
fun test(a : Int , b : Int) : Int{
return a + b
}
lambda
1 . val test : (Int , Int) -> Int = {a , b -> a + b}
// 或者
2 . val test = {a : Int , b : Int -> a + b}
第一種: 會(huì)限制返回值類型
- 在變量名后面接上傳入的參數(shù)
- "->"后為返回值類型
- "{**}" 內(nèi) "->"前為傳入的參數(shù)名
- "{**}" 內(nèi) "->"后為具體的方法
第二種: 不會(huì)限制返回值類型
- "{**}" 內(nèi) "->"前為傳入的參數(shù)名和參數(shù)類型
- "{**}" 內(nèi) "->"后為具體的方法
返回值確定規(guī)則
"{**}" 內(nèi) "->"后,最后一個(gè)參數(shù)或者函數(shù)為默認(rèn)返回值,不需要用 return
不同操作之間需要用回車區(qū)分(不能在同一行)
val test1: (Int, Int) -> Int = { a, b
->
" " // 操作一
for (i in 0..15) { // 操作二
}
a + b // 操作三 : 返回值
}
Lambda高階函數(shù)
用java在實(shí)際開(kāi)發(fā)中,如遇到以下情況
A.class 中,構(gòu)造方法中一個(gè)接口作為參數(shù),需要其他類實(shí)現(xiàn).
private final AiTest aiTest;
public A(AiTest aiTest) {
this.aiTest = aiTest;
}
public interface AiTest {
int onAi();
}
B.class 中 , b()中生成A對(duì)象,并實(shí)現(xiàn)接口,return返回值
public void b() {
new A(new A.AiTest() {
@Override
public int onAi() {
int result = 66 + 99;
return result;
}
});
}
那么下面在kotlin用Lambda實(shí)現(xiàn)
A.class
fun aiTest (b : () -> Int) : Int{
return b.invoke()
}
B.class 中
fun b() {
A().aiTest { 66 + 99 }
}
invoke()函數(shù):表示為通過(guò)函數(shù)變量調(diào)用自身,因?yàn)樯厦胬又械淖兞縝是一個(gè)匿名函數(shù)。
在A.class括號(hào)中
b : () -> Int
與
val test : (Int , Int) -> Int = {a , b -> a + b}
中等號(hào)前半部分一樣 ,后半部分在B.class類實(shí)現(xiàn),從而達(dá)到了接口的效果
下劃線(_)
在使用Lambda表達(dá)式的時(shí)候,可以用下劃線(_)表示未使用的參數(shù),表示不處理這個(gè)參數(shù)。
同時(shí)在遍歷一個(gè)Map集合的時(shí)候,這當(dāng)非常有用。
舉例:
val map = mapOf("key1" to "value1","key2" to "value2","key3" to "value3")
map.forEach{
key , value -> println("$key \t $value")
}
// 不需要key的時(shí)候
map.forEach{
_ , value -> println("$value")
}
輸出結(jié)果:
key1 value1
key2 value2
key3 value3
value1
value2
value3