kotlin中lambda表达式定义如下:
{param1:Type,param2:Type… -> ….}
例子
{x:Int,y:String -> y.length + x}
就是一个lambda表达式
在kotlin中如果要直接运行lambda,可以使用run{}来运行
run{45}
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
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等
这种例子太多了,就不一一举例了。