1弹沽、lambda表達式
fun main(args: Array<String>) {
val a=10
val b=5
//m,n,還有返回值的類型由函數(shù)的定義可以推斷出來畴嘶,可以省略不寫
println(cacl(a, b, { m:Int, n:Int ->Int
m + n
}))
println(cacl(a, b, { m, n ->
m - n
}))
}
fun cacl(a:Int,b:Int,block:(Int,Int)->Int):Int{
val result=block(a,b)
return result
}
輸出:
2、去括號
調用的時候如果最后一個參數(shù)傳遞的是匿名函數(shù)lambda表達式的話凝垛, 可以把()前移
fun main(args: Array<String>) {
val a=10
val b=5
//m,n,還有返回值的類型由函數(shù)的定義可以推斷出來懊悯,可以省略不寫
println(cacl(a, b) { m:Int, n:Int ->Int
m + n
})
println(cacl(a, b){ m, n ->
m - n
})
}
fun cacl(a:Int,b:Int,block:(Int,Int)->Int):Int{
val result=block(a,b)
return result
}
輸出:
3、lambda表達式單獨存在
fun main(args: Array<String>) {
//定義并調用
{
println("匿名函數(shù)梦皮、lambda表達式")
}.invoke()
//有參數(shù)lambda表達式
val result={a:Int,b:Int->
a+b
}(10,20)
println(result)
//保存lambda表達式
val function={
println("hello,world")
}
function.invoke()
}
輸出:
4炭分、返回值
lambda表達式的返回值是最后一行,不需要寫return
5剑肯、lambda表達式演變流程
fun main(args: Array<String>) {
var str="abc"
str.forEach {
println(it)
}
}
輸出:
看下forEach中這個lambda表達式的演變流程
首先看下forEach這個函數(shù)的定義
/**
* Performs the given [action] on each character.
*/
public inline fun CharSequence.forEach(action: (Char) -> Unit): Unit {
for (element in this) action(element)
}
很明顯
- 它是個擴展函數(shù)
- 它接收的參數(shù)是一個函數(shù)類型捧毛,這個函數(shù)有一個參數(shù)char并且沒有返回值
所以我們可以這樣寫:
fun main(args: Array<String>) {
var str="abc"
str.forEach(::print)
}
fun print(c:Char)
{
println(c)
}
輸出:
我們把print定義成匿名函數(shù):
fun main(args: Array<String>) {
var str="abc"
str.forEach(result)
}
val result={
c:Char->
println(c)
}
輸出:
繼續(xù)簡化,不預先定義result函數(shù),在調用forEach傳參數(shù)的時候再定義result函數(shù)
fun main(args: Array<String>) {
var str="abc"
str.forEach({
c:Char->
println(c)
})
}
繼續(xù)簡化呀忧,參數(shù)的最后一個如果是lambda表達式师痕,那么括號可以前移
fun main(args: Array<String>) {
var str="abc"
str.forEach(){
c:Char->
println(c)
}
}
前移之后如果函數(shù)沒有了參數(shù),那么括號可以省略
fun main(args: Array<String>) {
var str="abc"
str.forEach{
c:Char->
println(c)
}
}
如果lambda表達式只有一個參數(shù)而账,那么參數(shù)可以省略胰坟,用it代替
fun main(args: Array<String>) {
var str="abc"
str.forEach{
println(it)
}
}
最后的,也就是我們經常使用到的寫法