《Kotlin核心编程》 ——2.3 高阶函数和Lambda

举报
华章计算机 发表于 2020/02/21 20:28:46 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第2章,第2.3.1节,作者是水滴技术团队 。

2.3 高阶函数和Lambda

通过2.1节的介绍,我们发现Kotlin中的函数定义要更加简洁、灵活。这一节我们会介绍关于函数更加高级的特性—高阶函数和Lambda。由于在后续的内容中你要经常跟它们打交道,因此在开始不久我们就要充分地了解它们。

我们说过,Kotlin天然支持了部分函数式特性。函数式语言一个典型的特征就在于函数是头等公民—我们不仅可以像类一样在顶层直接定义一个函数,也可以在一个函数内部定义一个局部函数,如下所示:

fun foo(x: Int) {

    fun double(y: Int): Int {

        return y * 2

    }

    println(double(x))

}

>>> foo(1)

2

此外,我们还可以直接将函数像普通变量一样传递给另一个函数,或在其他函数内被返回。如何理解这个特性呢?

2.3.1 抽象和高阶函数

《计算机程序的构造和解释》这本经典的书籍的开篇,有一段关于抽象这个概念的描述:

心智的活动,除了尽力产生各种简单的认识外,主要表现在如下3个方面:

1)将若干简单的认识组合为一个复合认识,由此产生出各种复杂的认识;

2)将两个认识放在一起对照,不管它们如何简单或者复杂,在这样做时并不将它们合二为一;由此得到有关它们的相互关系的认识;

3)将有关认识与那些在实际中和它们同在的所有其他认识隔离开,这就是抽象,所有具有普遍性的认识都是这样得到的。

简单地理解,我们会善于对熟悉或重复的事物进行抽象,比如2岁左右的小孩就会开始认知数字1、2、3……之后,我们总结出了一些公共的行为,如对数字做加减、求立方,这被称为过程,它接收的数字是一种数据,然后也可能产生另一种数据。过程也是一种抽象,几乎我们所熟悉的所有高级语言都包含了定义过程的能力,也就是函数。

然而,在我们以往熟悉的编程中,过程限制为只能接收数据为参数,这个无疑限制了进一步抽象的能力。由于我们经常会遇到一些同样的程序设计模式能够用于不同的过程,比如一个包含了正整数的列表,需要对它的元素进行各种转换操作,例如对所有元素都乘以3,或者都除以2。我们就需要提供一种模式,同时接收这个列表及不同的元素操作过程,最终返回一个新的列表。

为了把这种类似的模式描述为相应的概念,我们就需要构造出一种更加高级的过程,表现为:接收一个或多个过程为参数;或者以一个过程作为返回结果。

这个就是所谓的高阶函数,你可以把它理解成“以其他函数作为参数或返回值的函数”。高阶函数是一种更加高级的抽象机制,它极大地增强了语言的表达能力。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。