Kotlin開發三 kotlin中的lambda表示式
1 Lambda表示式定義
kotlin中lambda表示式定義如下:
{param1:Type,param2:Type… -> ….}
例子
{x:Int,y:String -> y.length + x}
就是一個lambda表示式
在kotlin中如果要直接執行lambda,可以使用run{}來執行
run{45}
2 kotlin中lambda表示式的約定
kotlin中對於lambda有很多簡化的約定,我們來看一個例子
val people = listOf(User("張三",14),User("李四",16)) println("年紀最大:" + people.maxBy { it.age })
這裡的lambda和我們看到的定義不太一樣,如果完全不簡寫,那麼完整的例子如下:
println("年紀最大:" + people.maxBy ({user:User -> user.age }))
那麼最終為什麼會簡化成people.maxBy { it.age })呢,我們來看kotlin中lambda的約定
1 如果lambda表示式是函式呼叫的最後一個實參,它可以放在括號外面
如上所示,那麼可以簡化為:
println("年紀最大:" + people.maxBy(){user:User -> user.age })
我們看到,還可以簡化
2 當lambda是函式唯一的實參時,可以去掉函式呼叫的括號
println("年紀最大:" + people.maxBy{user:User -> user.age })
3 如果lambda的引數的型別可以推導,那麼可以省略引數的型別
println("年紀最大:" + people.maxBy{user -> user.age })
這裡對people集合操作,其元素資料型別是User,因此可以省略不寫
4 對於lambda中一個引數時,可以使用預設引數名稱it來代替命名引數,並且lambda的引數列表可以簡化,省略引數列表和->
println(“年紀最大:” + people.maxBy { it.age })
到這裡,我們可以看到的lambda形式就是在kotlin中經常出現的形式
上面介紹的是函式只有一個引數的情況,我們來看多個引數的情況
fun lambdaTest1(a:Int,b: (String) -> String){
println("$a + ${b(a.toString())}")
}
fun lambdaTest2(b: (String) -> String,a:Int){
println("$a + ${b(a.toString())}")
}
fun lambdaTest3(b: (arg1:String,arg2:Int) -> String,a:Int){
println("$a + ${b(a.toString(),100)}")
}
使用如下:
lambdaTest1(3){"hello:" + it}
lambdaTest2({"hello:" + it},5)
lambdaTest3({arg1, arg2 -> "hello:$arg1 + $arg2"},58)
輸出結果如下:
3 + hello:3
5 + hello:5
58 + hello:58 + 100
3 Lambda在kotlin中的用途
1 作為單獨的功能塊單獨使用
如下,定義兩個數的和這樣一個功能塊
val sum = {a:Int,b:Int -> a+b}
println(sum(2,9))
作為單獨的功能塊,如上所示,可以直接賦值給某個變數
2 作為函式引數的程式碼塊
如上所示,例如lambdaTest1,LambdaTest2等,可以定義函式的引數是一個lambda形式,這樣我們在傳遞的實參的是否傳入lambda即可
3 集合中使用lambda
kotlin中集合中的很多操作都支援lambda,例如maxBy,map,fliter等
這種例子太多了,就不一一舉例了。