高阶函数
高阶函数是指Kotlin中参数为另一函数或者返回值为函数的函数
具体例子见下代码块
fun printArr(arr:Array<Int>,f:(Array<Int>)->Unit){ //函数作为参数 f(arr) } fun main(args:Array<String>){ val doPoint:(Array<Int>)->Unit={ for (x in it){ print("$x ") } println() } val arr= arrayOf(1,3,5,7,9) printArr(arr,doPoint) }
函数类型
Kotlin中的函数类型为 (参数类型) ->返回值类型
参数为空时,参数类型可省略不写,即()->返回值类型,但无返回值类型时,->后要写Unit
当函数类型为可空时的声明是:((参数类型)->返回值类型)?
函数类型允许套用,套用时->是右结合
上一节中的类型别名也可以用到函数类型这里
函数类型的实例化
函数类型的实例化方法有很多,这里主要介绍匿名函数、Lambda表达式和类构造三种方法
1.匿名函数
匿名函数的声明定义与常规类型类似,只是省去了函数名称
fun (参数):返回值{ 方法体 } 当参数类型和返回值类型可以推断到时可省略不写
val doPoint:(Array<Int>)->Unit=fun (arr:Array<Int>){ for (x in arr){ print("$x ") } }
通过匿名函数的返回值即可调用该匿名函数
2.类构造
构建类型为函数类型的类,覆盖invoke方法,构建类对象调用invoke方法即可
fun printArr(arr:Array<Int>,f:(Array<Int>)->Unit){ f.invoke(arr) } class doPointClass:(Array<Int>)->Unit{ override fun invoke(p1: Array<Int>) { for (x in p1){ print("$x ") } println() } } fun main(args:Array<String>){ val b=doPointClass() val arr= arrayOf(1,3,5,7,9) printArr(arr,b) }
3.Lambda方法在下一标题详细介绍
内联函数
当使用高阶函数时,因为Kotlin中一切皆为对象,所以函数作为参数或函数作为返回值会造成一些运行效率的损失,比如内存分配时需要额外分配函数对象所占的内存,增加了运行时间的开销。类似上述代码,传参时还需定义值为函数体的变量
为解决高阶函数的效率问题,引入了内联函数inline
inline修饰符将影响被修饰函数本身和传给它的lambda表达式:所有这些都将内联到调用处。
inline fun printArr(arr:Array<Int>, f:(Array<Int>)->Unit){ f(arr) } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) printArr(arr) { for (x in it) { print("$x ") } }//Lambda表达式提出至()外 }
Lambda函数
Lambda表达式语法具体是:{参数 ->方法体}
当Lambda表达式的函数类型返回值定义不是Unit时,{}内最后一个表达式作为返回值
视为return 该表达式
1.传递末尾的lambda表达式
当函数的最后一个参数为函数时,该函数的lambda实现可以放到()外
inline fun printArr(arr:Array<Int>, f:(Array<Int>)->Unit){ f(arr) } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) printArr(arr){for (x in it) print("$x ") } //传递末尾的lambda表达式 }
2.当lambda表达式的函数类型定义为只有一个参数时,可用 it 隐式指代
代码示例见1
3.当lambda表达式参数有多个,则须在{ }内先给出参数名和参数类型,再在->后接函数体
inline fun arrPlus(arr:Array<Int>,arr1:Array<Int>,f:(Array<Int>,Array<Int>)->Array<Int>){ val res=f(arr,arr1) for (x in res) print("$x ") println() } fun main(args:Array<String>){ val arr= arrayOf(1,3,5,7,9) val arr1= arrayOf(2,4,6,8,10) arrPlus(arr,arr1){ arr,arr1-> val minSize=if(arr.size<arr1.size) arr.size else arr1.size for (i in 0 until minSize) arr[i]+=arr1[i] arr } }