拓展
匿名函数
定义时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。有了它,我们能够根据需要制定特殊规则,轻松定制标准库里的内置函数。
{}
就代表匿名函数。
it关键字
只有一个参数的匿名函数时,可以使用it关键字来表示参数名。当你需要传入两个值参,it关键字就不能用了。这里简单的了解一下,在后面的实践中使用。
函数类型和隐式返回
函数的类型,由传入的参数和返回值类型决定。
隐式返回:除了极少数情况外,匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果。
实践
fun main() { //1、声明函数的输入() 输出String val scFun :() -> String //2、实现函数 scFun = { val name = "帅次" // 匿名函数不需要写retrun,最后一行就是返回值 "$name 就是个战五渣" } //此处别忘记加(),这里是函数而不是属性 println(scFun()) }
然后你会发现在第一步下面有虚线,咱们操作一下。
代码如下,更加简洁了
fun main() { //1、声明函数的输入() 输出String //2、实现函数 val scFun :() -> String = { val name = "帅次" // 匿名函数不需要写retrun,最后一行就是返回值 "$name 就是个战五渣" } println(scFun()) }
匿名函数参数
匿名函数可以不带参数,也可以带一个或多个任何类型的参数。
需要带参数时,参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中。
实践
fun main() { //带参数 val scFun2: (Int) -> String = { age -> val name = "帅次" // 匿名函数不需要写retrun,最后一行就是返回值 "$name 就是个战$age 渣" } println(scFun2(16)) }
这里是一个参数咱们尝试使用一下it关键字
it关键字实践
看 1 处,还有警告:这里的it代表传入的Int。
当这里的传入参数变成多个时,it就无法使用了。
类型推断
定义一个变量时,如果已把匿名函数作为变量赋值给它,就不需要显示指明变量类型。
无参类型推断
实践
1. //无参类型推断 val scFun4 = { val name = "帅次" // 匿名函数不需要写retrun,最后一行就是返回值 "$name 无参类型推断" } println(scFun4())
带参类型推断
实践
//带参类型推断 val scFun5 = { age:Int,money:Float-> val name = "帅次" // 匿名函数不需要写retrun,最后一行就是返回值 "$name 带参类型推断 $age 岁啦,兜里$money" } println(scFun5(15,1.25f))
定义一个函数:参数是函数
一个函数,作为另一个函数的参数。
实践
fun main() { //2、声明函数 val bookBeginner = {bookName:String,price:Double-> "$bookName 定价为:$price" } //3、调用函数,传入函数bookBeginner learningAndroidBook("帅次",bookBeginner) } //1、定义一个函数(learningAndroidBook):参数是函数(bookPrice) fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){ println("$name 来自 learningAndroidBook ") println(bookPrice(name,48.88)) }
简略写法
一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda值参的一对圆括号就可以省略。
fun main() { //4、简略写法(参数排在最后) learningAndroidBook("Kotlin 简略写法"){bookName:String,price:Double-> "$bookName 定价为:$price" } //5、简略写法(唯一一个参数),()省略了 learningAndroidBook2{bookName:String,price:Double-> "$bookName 定价为:$price" } } //定义一个函数,参数是函数 fun learningAndroidBook2(bookPrice:(String,price:Double)->String){ println(bookPrice("Kotlin 简略写法-唯一一个参数",48.88)) }
函数引用
要把函数作为参数传给其他函数使用,除了传lambda表达式(匿名函数),kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。
实践
fun main() { //6.2、函数引用 learningAndroidBook("函数引用",::bookPriceName); } //6.1 定义具名函数 fun bookPriceName(bookName:String,price:Double):String{ //具名函数这里要加return return "$bookName 定价为:$price" } //1、定义一个函数(learningAndroidBook):参数是函数(bookPrice) fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){ println("$name 来自 learningAndroidBook ") println(bookPrice(name,48.88)) }
函数返回类型为匿名函数
fun main() { //使用 val funName = helloSc() println(funName(15)) } //定义具名函数,返回类型为匿名函数 fun helloSc():(Int)->String{ val name = "渣渣次" //返回的匿名函数,age传入的参数 return {age-> //匿名函数返回类型 "$age 岁的$name" } }
文章知识点与官方知识档案匹配,可进一步学习相关知识