1. 程式人生 > >Kotlin開發三 kotlin中的lambda表示式

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等
這種例子太多了,就不一一舉例了。