Android开发Android开发经验谈Android技术知识

Kotlin高阶函数

2019-07-15  本文已影响27人  程序员丶星霖

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

学海无涯苦作舟

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读