Kotlin笔记 第六章 (四)匿名函数.md

版权声明:本文为博主原创文章,未经博主允许不得转载。 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函数,正常执行流程是:

  1. 保护fn现场
  2. 进入foo函数或者lambda表达式地址的执行foo函数
  3. 执行完后,恢复现场

但是使用内联函数:就不会进入函数地址去执行上面的第二步,而是将该函数或者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修饰形参

猜你喜欢

转载自blog.csdn.net/Leslie_LN/article/details/82841917