请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 662|回复: 0

[Android] 使用函数类型作为形参类型——Kotlin高阶函数之二

[复制链接]
发表于 2017-11-26 19:18:37 | 显示全部楼层 |阅读模式
本帖最后由 kongyeeku 于 2018-2-1 23:20 编辑
本文节选自《疯狂Kotlin讲义》

京东购买地址:https://item.jd.com/12284595.html
当当购买地址:http://product.dangdang.com/25221010.html
有时候需要定义一个函数,该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时无法确定——这意味着某些程序代码需要动态改变,如果希望调用函数时能动态传入这些代码,这就需要在函数中定义函数类型的形参,这样即可在调用该函数时传入不同的函数作为参数,从而动态改变这段代码。
Kotlin支持像使用其他类型一样使用函数类型,因此完全可以在函数中定义函数类型的形参。例如如下程序。
程序清单:codes\06\6.5\FunctionParamTest.kt
// 定义函数类型的形参,其中fn是(Int) -> Int类型的形参
fun map(data : Array<Int>,  fn: (Int) -> Int) : Array<Int> {
        var result = Array<Int>(data.size, {0})
        // 遍历data数组中每个元素,并用fn函数对data[j]进行计算
        // 然后将计算结果作为新数组的元素
        for (i in data.indices) {
                result[j] = fn(data[j])
        }
        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
}
fun main(args: Array<String>) {
        var data = arrayOf(3 , 4 , 9 , 5, 8)
        println("原数据${data.contentToString()}")
        // 下面程序代码3次调用map()函数,每次调用时传入不同的函数
        println("计算数组元素的平方")
        println(map(data , ::square).contentToString())
        println("计算数组元素的立方")
        println(map(data , ::cube).contentToString())
        println("计算数组元素的阶乘")
        println(map(data , ::factorial).contentToString())
}
上面程序中定义了一个map()函数,该函数的第2个参数是一个函数类型的形参,这意味着每次调用函数时可动态传入一个函数,随着实际传入函数的改变,就可以动态改变map()函数中的部分计算代码。
接下来主程序的3行粗体字代码调用了map()函数3次,3次调用时依次传入了square、cube、factorial函数作为参数,这样每次调用map()函数时实际的执行代码是有区别的。
编译、运行上面程序,可以看到如下输出:

原数据[3, 4, 9, 5, 8]
计算数组元素的平方
[9, 16, 81, 25, 64]
计算数组元素的立方
[27, 64, 729, 125, 512]
计算数组元素的阶乘
[6, 24, 362880, 120, 40320]
从上面介绍不难看出,定义函数类型的形参就可以在调用函数时动态地传入函数——实际上就可以动态地改变被调用函数的部分代码。
这种用法其实就是“命令模式”,如果读者熟悉Java编程的知识,不难发现这种用法与Java的Lambda表达式的用法大同小异。
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-8-24 22:46 , Processed in 0.290932 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表