版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leslie_LN/article/details/82841917
匿名函数
故名思意,就是没有函数名的函数
形式:
fun(形参列表):返回值类型{
函数体
}
1、匿名函数返回值类型声明
和普通函数返回值类型声明一样:如果使用普通代码块作为函数体有返回值显示声明函数返回值类型,否则认为函数没有返回值(没有函数返回值声明、或者是:Unit);如果函数体是单表达式,则无需指定函数返回值类型,系统可以自动推断出;
//1.没有返回值的两种写法
fun test(age:Int):Unit{
}
fun test(age:Int){
}
//2.函数体是单表达式
fun test(X:Int,y:Int)=x+y
//3.函数体是普通代码块
fun test():Int{
。。。。。
return
}
如果系统可以推断出匿名函数的形参类型,那么匿名函数可以省略形参类型;
2、内联函数
使用"inline"关键字修饰函数,该函数的函数类型的形参如下:
inline fun fn(foo:(Int)->String){
foo(1)
}
fun foo(a:Int):String{
return "leslie"
}
调用:fn(::foo)
如果没有不是inline函数,正常执行流程是:
- 保护fn现场
- 进入foo函数或者lambda表达式地址的执行foo函数
- 执行完后,恢复现场
但是使用内联函数:就不会进入函数地址去执行上面的第二步,而是将该函数或者lambda表达式的代码拷贝到函数中,此时在lambda表达式使用return语句就相当于返回其所在函数;
这时如果在lambda表达式中使用return语句,下面我们会讲到lambda表达式的return语句返回的是他所在函数,因此此时在lambda表达式使用return语句将会报错;
2.1、匿名函数和Lambda表达式的return
函数中的return返回该函数本身,lambda表达式中的return语句返回其所在函数;
默认情况下,Lambda表达式不允许使用return,但内联函数可以
var array = arrayOf("android","java", "kotlin","Go")
array.forEach(fun(el:String){
Log.d("TAG","元素依次为:${el}")]
return
})
故,可以得出结论:在非内联函数中,lambda表达式不能使用return语句,否则会报错
2.2、禁止部分内联
如果函数中有几个函数类型的形参,有的函数类型形参如果你不想使用内联,可以在形参前面使用noinline修饰形参