匿名函数
➢ 定义时不取名字的函数,称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。
➢ 匿名函数对Kotlin来说很重要,有了它,我们能够根据需要制定特殊规则,轻松定制标准库里的内置函数。
匿名函数与隐式返回
➢ 匿名函数也有类型,匿名函数可以当作变量赋值给函数类型变量,就像其他变量一样,匿名函数就可以在代码里传送了。变量有类型,变量可以等于函数,函数也会有类型。
函数的类型,由传入的参数和返回值类型决定。
➢和具名函数(具名函数)会隐式或自动返回函数体最后一行语句的结果。
fun main() {
//第一种写法
//变量的类型是一个匿名函数
val blessingFunction:()->String
blessingFunction={
val holiday = "New Year"
"Happy $holiday"
}
//简写
val blessingFunction2:()->String ={
val holiday = "New Year"
"Happy $holiday"
}
}
函数参数
和具名函数(具名函数)一样,匿名函数可以不带参数,也可以带一个或多个任何类型的参数,需要带参数时,参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中。
fun main() {
val blessingFunction: (String) -> String = { name ->
val holiday = "Near year"
"$name , Happy$holiday"
}
}
it 关键词
➢定义只有一个参数的匿名函数时,可以使用it关键词来表示参数名。当你需要传入两个值参,it关键词就不能使用了。
fun main() {
val blessingFunction: (String) -> String = { name ->
val holiday = "Near year"
"$name , Happy$holiday"
}
val blessingFunction2: (String) -> String = {
val holiday = "Near year"
" Happy$holiday"
}
}
类型推断
➢定义一个变量时,如果已把匿名函数作为变量赋值给它,就不需要显示指明变量类型了。如下图,系统自动推断为 String类型:
fun main() {
val blessingFunction: (String) -> String = {
val holiday = "Near year"
" Happy$holiday"
}
//不需要显示指明变量类型,省略: (String) -> String
val blessingFunction2 = {
val holiday = "Near year"
" Happy$holiday"
}
}
类型推断也支持带参数的匿名函数,但为了帮助编译器更准确地推断变量类型,匿名函数的参数名和参数类型必须有。如下图第二个函数中的(name:String,year:Int)必须有。
fun main() {
val blessingFunction:(String,Int)->String={
name,year->
"$name, Happy $year"
}
//类型推断写法 参数名和参数类型必须有 name:String,year:Int
val blessingFunction2={name:String,year:Int->
"$name, Happy $year"
}
}
什么是Lambda?
我们将匿名函数称为Lambda,将它的定义成为lambda表达式,它返回的数据称为lambda结果。为什么叫lambda?lambda也可以使用希腊字符 λ 表示是lambda演算的简称,lambda演算是一套数理演算逻辑,由数学家Alonzo Church(阿隆佐.丘齐)于20世纪30年代发明,在定义匿名函数时,使用了lambda演算记法
定义参数是函数的函数
➢ 函数的参数是另外一个函数
代码示例:
fun main() {
val getDiscountWords={ goodName:String ,hour:Int->
val currentYear =2017
"${currentYear}年,双11${goodName}促销倒计时:$hour 小时"
}
showOnBoard("卫生纸",getDiscountWords)
}
fun showOnBoard(goodName: String, getDiscountWords: (String, Int) -> String) {
val hour = (1..24).shuffled().last()
print(getDiscountWords(goodName,hour))
}
简略写法
➢如果一个函数的lambda参数在最后,或者是唯一的参数,那么括住lambda值参数的一对圆括号就可以省略。
val getDiscountWords={ goodName:String ,hour:Int->
val currentYear =2017
"${currentYear}年,双11${goodName}促销倒计时:$hour 小时"
}
showOnBoard("卫生纸",getDiscountWords)
//简略写法
showOnBoard("卫生纸"){ goodName:String ,hour:Int->
val currentYear =2017
"${currentYear}年,双11${goodName}促销倒计时:$hour 小时"
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)