高阶函数
函数类型
在我们熟知的编程语言中没有函数类型这个东西,Kotlin中提出了这个概念
函数类型的基本语法规则:
(String,Int)->Unit
->的左边部分是函数类型的参数,用一个括号放入参数,多个参数用逗号隔开
->的右边部分是函数类型的返回值类型
高阶函数
高阶函数的定义
如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数
高阶函数接收的这个函数参数就是上述的函数类型
举例说明
下面我们看一个高阶函数的例子:
fun highOrderFun(func:(String,Int)->Unit){
func("abc","123"); //函数参数的调用和普通参数一样,传入括号中对应的参数就行
}
使用高阶函数,我们就可以让传入的参数类型来决定函数的执行逻辑,下面我举例说明
(1)首先我定义一个高阶函数
//此高阶函数中的函数类型,它会实现两个正整数的某种算数操作
fun num1AndNum2(num1:Int,num2:Int,calculate:(n1:Int,n2:Int)->Int):Int{
return calculate(num1,num2)
}
(2)调用高阶函数的方法
- 定义一个与函数类型匹配的函数A,然后在调用时将该函数传入函数类型,传入时的写法为::A
//两数相加
fun add(n1:Int,n2:Int):Int{
return n1+n2
}
//两数相乘
fun multiplication(n1:Int,n2:Int):Int{
return n1*n2
}
//调用高阶函数,其具体的运算逻辑就是我们传入的add和multiplication,分别执行两个数相加和两个数相乘
val result1=num1AndNum2(2,5,::add)
val result2=num1AndNum2(2,5,::multiplication)
- (2)直接使用Lambda高阶函数
val result1=num1AndNum2{n1,n2->n1+n2}
val result2=num1AndNum2{n1,n2->n1*n2}
一个常用的简化代码实例
fun StringBuilder.build(block:StringBuilder.()->Unit):StringBuilder{
block()
return this
}
上述代码中我们给StringBuilder类定义了一个build扩展函数,这个扩展函数接收了一个函数类型,函数类型前面加上了StringBuilder.,表明我们的函数类型定义在StringBuilder这个类中。
然后当我们调用这个扩展函数时,Lambda表达式中就会拥有StringBuilder的上下文,且函数的返回值为StringBuilder,所以我们可以使用build这个扩展函数来简化StringBuilder对字符串的构建。
val stringBuiler=StringBuilder().buid{
append("abc")
append("qwe")
}