Kotlin-高阶函数


声明:本文转载自https://my.oschina.net/tingzi/blog/1825245,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

函数是一个类型,就像编程语言中的基本类型一样,就像Java中的引用类型一样,函数是函数类型。基本类型、引用类型、函数类型,说白了物理空间就是内存的一段区域,逻辑空间叫什么基本类型、引用类型、函数类型。基本类型就是int, float这种存储数据的,引用类型就是类呗,一个类在内存中不也是一段区域嘛,函数类型就是一段操作流程呗,一段操作流程在内存中不也是一段区域嘛。总之一样啦。猫是动物,狗是动物,人家棕熊也是动物啦,都在地球上占据一定的空间,不能把人家当成空气。

     

既然他们都是一种类型,那就要同等对待,既可以作为变量,也可以作为常量;既可以作为函数形参,也可以作为函数返回值。猫和狗能结婚生子,人家棕熊也可以,不可以把人家阉割了。物物平等。

fun add(a: Int, b: Int) : Int {     return a + b }

上面这个棕熊,哦,不对,函数,上面这个函数的类型是啥?

不知道吧,我告诉你,是这个:

(Int, Int) -> Int

惊不惊喜?咦,看不懂?回去补补lambda表达式去,老衲不负责给你补基础知识。哇咔咔!

好啦,既然函数有类型了,那我们用函数声明变量吧,它和用基本类型,用类声明变量是一样一样嘀。

var myfun : (Int, Int) -> Int    //函数类型 var myBase : Float               //基本类型 var myClass : String             //引用类型

从此,江湖上出现了三剑客:基本类型、函数类型、引用类型。打遍天下无敌手。

定义完类型了,我得赋值啊,要不我定义类型干啥。

客官请看下面内容:

myfun = :: add   //使用函数引用要用::,不能加(),因为加()就变成调用函数了,而不是使用函数引用 myBase = 1.5f myClass = String("你瞅啥,我就喜欢用String的构造函数咋地")  //实例化对象不需要用new了,直接用对象的构造函数 myClass = "当然,直接这样写也是可以的"

再来,函数类型作为形参:

fun sum(a: Int, b: Int, fn: (Int, Int) -> Int): Int {     return fn(a, b) }

我就喜欢把函数类型传进去,咋嘀!

再来,函数类型作为返回值:

fun getMathFunc(type: String): (Int, Int)-> Int {     // 定义一个计算加法的局部函数     fun add(a: Int, b: Int) : Int {         return a + b;     }     // 定义一个计算减法的局部函数     fun sub(a: Int, b: Int) : Int {         return a - b;     }     // 定义一个计算乘法的局部函数     fun mul(a: Int, b: Int) : Int {         return a * b;     }          when(type) {         "add" -> return ::add         "sub" -> return ::sub         else -> return ::mul     }      }  fun main(args: Array<String>) {     var mathFunc = getMathFunc("add")   //得到add函数     println(mathFunc(5, 3))             //输出8     mathFunc = getMathFunc("sub")       //得到sub函数     println(mathFunc(5, 3))             //输出2     mathFunc = getMathFunc("mul")       //得到mul函数     println(mathFunc(5, 3))             //输出15 }

好啦,就说到这里吧,既然函数又能作为变量,又能作为形参,又能作为返回值,说不定还能作为常量(我猜测地,不过函数作为常量干啥,函数本身就是变化地,作为常量干啥,哈哈哈,完全没用,就像你把类实例化的对象作为常量干啥,也没用哇),那么函数这么厉害,和其他类型一样,就要给它和之前我们简单使用的函数做出区分,至少在名词上做出区分,这样才让人感觉高大上。记住,叫“高阶函数”!这个不重要,忘了也没事,别在意,就是个多余的名字嘛,之前的函数不被阉割掉,也不会出现这么个多余的名字。好吧,你可以这么理解,之前世界上的棕熊都是被阉割的,现在的棕熊才是正常的,和猫啊,狗啊一样,都能结婚生子。阿弥陀佛~~

我对自己是有要求嘀,是要求自己尽量写出更优雅的代码嘀,再来:

上面的局部函数太繁琐,替换成lambda表达式:

fun getMathFunc(type: String): (Int, Int)-> Int {     when(type) {         "add" -> return {a: Int, b: Int -> a + b}         "sub" -> return {a: Int, b: Int -> a - b}         else -> return {a: Int, b: Int -> a * b}     } }  fun main(args: Array<String>) {     var mathFunc = getMathFunc("add")   //得到add函数     println(mathFunc(5, 3))             //输出8     mathFunc = getMathFunc("sub")       //得到sub函数     println(mathFunc(5, 3))             //输出2     mathFunc = getMathFunc("mul")       //得到mul函数     println(mathFunc(5, 3))             //输出15 }

终于可以OVER了~~~

本文发表于2018年06月06日 16:00
(c)注:本文转载自https://my.oschina.net/tingzi/blog/1825245,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2541 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

万稳万当,不如一默。任何一句话,你不说出来便是那句话的主人,你说了出来,便是那句话的奴隶。

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1