Kotlin的函数也具有自己的类型。函数类型既可以用于定义变量,也可用作函数的形参类型,还可以作为函数的返回值类型。
一、使用函数类型
Kotlin的每一个函数都有特定的类型,函数类型由函数的形参列表、->和返回值类型组成。
func foo(a:Int,name:String)->String{
..
}
上例的形参列表、->和返回值类型位(Int,String)->String。这就是该函数的类型。
fun main(args: Array<String>) {
//定义一个变量,其类型为(Int,Int)->Int
var myFun: (Int, Int) -> Int
//定义一个变量,其类型为(String)
var test: (String)
//定义一个计算乘方的函数
fun pow(base: Int, exponent: Int): Int {
var result = 1
for (i in 1..exponent) {
result *= base
}
return result
}
//将pow函数赋值给myFun,则myFun可当成pow使用
myFun = ::pow
println(myFun(3, 4))
}
输出结果:
81
当直接访问一个函数的函数引用,而不是调用函数时,需要在函数名前添加两个冒号,而不能在函数后面添加圆括号。
一旦添加圆括号,就变成了调用函数,而不是访问函数引用。
二、使用函数类型作为形参类型
Kotlin支持想使用其他类型一样使用函数类型,所以可以在函数中定义函数类型的形参。
fun main(args: Array<String>) {
var data = arrayOf(3, 4, 9, 5, 8)
println("原数据${data.contentToString()}")
println("计算数组元素的平方")
println(map(data, ::square).contentToString())
println("计算数组元素的立方")
println(map(data, ::cube).contentToString())
println("计算数组元素的阶乘")
println(map(data, ::factorial).contentToString())
}
//定义函数类型的形参,其中fn是(Int)->Int类型的形参
fun map(data: Array<Int>, fn: (Int) -> Int): Array<Int> {
var result = Array<Int>(data.size, { 0 })
for (i in data.indices) {
result[i] = fn(data[i])
}
return result
}
//定义一个计算平方的函数
fun square(n: Int): Int {
return n * n
}
//定义一个计算立方的函数
fun cube(n: Int): Int {
return n * n * n
}
//定义一个计算阶乘的函数
fun factorial(n: Int): Int {
var result = 1
for (index in 2..n) {
result *= index
}
return result
}
输出结果:
原数据[3, 4, 9, 5, 8]
计算数组元素的平方
[9, 16, 81, 25, 64]
计算数组元素的立方
[27, 64, 729, 125, 512]
计算数组元素的阶乘
[6, 24, 362880, 120, 40320]
定义了函数类型的形参后,就可以在调用函数时动态地传入函数。
三、使用函数类型作为返回值类型
Kotlin还支持定义函数类型的返回值。
fun main(args: Array<String>) {
var mathFunc=getMathFunc("square")
println(mathFunc(5))
mathFunc=getMathFunc("cube")
println(mathFunc(5))
mathFunc=getMathFunc("other")
println(mathFunc(5))
}
fun getMathFunc(type: String): (Int) -> Int {
fun square(n: Int): Int {
return n * n
}
fun cube(n: Int): Int {
return n * n * n
}
fun factorial(n: Int): Int {
var result = 1
for (index in 2..n) {
result *= index
}
return result
}
when (type) {
//调用局部函数
"square" -> return ::square
"cube" -> return ::cube
else -> return ::factorial
}
}
输出结果:
25
125
120
网友评论