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等
这种例子太多了,就不一一举例了。

你可能感兴趣的:(Kotlin)