Kotlin高阶函数

作者: 程序员丶星霖 | 来源:发表于2019-07-15 08:58 被阅读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

    相关文章

      网友评论

        本文标题:Kotlin高阶函数

        本文链接:https://www.haomeiwen.com/subject/pjxpfctx.html