来吧,这节接着来学习Kotlin的匿名函数。要是对变量、函数定义、条件语句还不太清楚的可以看下前一篇:Kotlin基础(1)
1、匿名函数
定义时不取名字的函数,我们称之为匿名函数。匿名函数通常整体传递给其它函数或者从其它函数返回。
val total = "Nice To Meet You".count()
val toatlL = "Nice To Meet You".count({letter->
letter == 'l'
})
println(total)
println(toatlL)
匿名函数也有类型,匿名函数可以当作变量赋值给函数类型变量,就像其它变量一样。匿名函数不需要return关键字来返回数据,匿名函数会隐士或自动返回函数体最后一行语句的结果。
val sayHello:()->String = {
val name = "Jcak"
"Nice to meet you,${name}"
}
println(sayHello())
//运行结果
//Nice to meet you,Jcak
匿名函数可以不带参数,也可以带一个或多个任何类型的参数。需要带参数时,参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中。
//这里带一个String类型的参数
val sayHello:(String)->String = {name->
"Nice to meet you,${name}"
}
println(sayHello("Jcak"))
定义只有一个参数的匿名函数时,可以使用it关键字来表示参数名。当你需要传入两个参数时,it关键字就不能用了
//只有一个参数,默认可以使用it关键字来代替参数名
val sayHello:(String)->String = {
"Nice to meet you,${it}"
}
println(sayHello("Jcak"))
//当有2个及以上参数的时候,it关键字不能在使用,需要具体参数名
val sayHello:(String,Int)->String = {name,age->
"Nice to meet you,${name}。Age is ${age}"
}
println(sayHello("Jcak",30))
类型推断:匿名函数也支持类型推断,但为了帮助编译器更准确的推断变量类型,匿名函数的参数名和参数类型必须有
val sayHello = {name:String,age:Int ->
"Nice to meet you,${name}。Age is ${age}"
}
println(sayHello("Jcak",30))
这段代码与上面的代码效果是一样的,只是参数类型以及返回类型都是自动推断的。需要注意的是在写参数名的地方需要带上参数类型。这样编译器才知道你的参数类型是什么,该怎么用。
2、lanbda表达式
函数的参数是另外一个函数
fun getSayStr(name:String,say:(String,Int)->String){
println(say(name,30))
}
val sayHello = {name:String,age:Int ->
"Nice to meet you,${name}。Age is ${age}"
}
//在调用getSayStr的时候将匿名参数sayHello作为参数传递进去了
getSayStr("Jcak",sayHello)
如果一个函数的lambda参数排在最后或者是唯一的参数,那么括住lambda值参的一对圆括号可以省略。
getSayStr("Jcak"){name:String,age:Int ->
"Nice to meet you,${name}。Age is ${age}"
}
这段代码与上面的效果是一样的。但讲真,这个还真不好看,大括号内的很容易被理解为函数体而非匿名函数。现在知道为什么要学Kotlin的语法了吧,不然以后看到人家这样写,还真不知道怎么回事啊。
函数引用:要把函数作为参数传递给其它函数使用,除了传lambda表达式,kotlin还提供了其它方法,传递函数引用,函数引用可以把一个具名函数转换为一个值参,使用lambda表达式的地方,都可以使用函数引用。
fun getSayStr(name:String,say:(String,Int)->String){
println(say(name,30))
}
fun say(name: String,age:Int):String{
return "Nice to meet you,${name}。Age is ${age}"
}
//在调用的时候用::引用函数名
getSayStr("Jcak",::say)
函数类型也是有效的返回类型,可以定义一个能返回函数的函数
fun sayHello():(String)->String{
return {
"Nice to meet you,${it}"
}
}
val sayHelloFunc = sayHello()
println(sayHelloFunc("Jcak"))
在Java8支持lambda表达式,但不支持将函数作为参数传递给另一个变量或者函数。在Java中的替代方案是匿名内部类(接口)