博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数和闭包之头等函数
阅读量:6404 次
发布时间:2019-06-23

本文共 1493 字,大约阅读时间需要 4 分钟。

  hot3.png

什么是头等函数(First-class function)?

关于First-class function的介绍,可以参考:http://en.wikipedia.org/wiki/First-class_function
In computer science, a programming language is said to have first-class functions if it treats functions as first-class citizens. Specifically, this means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures.
简单的翻译:
在计算机科学的一个编程语言中,如果它把方法作为一等公民的时候,那么这个编程语言就含有头等函数(first-class functions)。特别是,这意味着那个语言支持将函数当作参数传递给其他的函数从那其他的函数里返回出值,并且可以将他们设定为变量,或者将他们存储在数据结构中。

Scala的函数是头等函数。你不仅可以定义和调用函数,还可以把它们写成匿名的函数字面量,并把它们作为值传递。函数字面量被编译进类,并在运行期间实例化为函数值。函数字面量区别在于:函数字面量存在于源代码,而函数值作为对象存在于运行期。这个区别很像类(源代码)对象(运行期)之间的关系。

下面是对整数执行递增操作的函数字面量的简单例子:

213252_WVmW_168814.jpg

=>指明这个函数把左边的东西(任何整数x)转变成右边的东西(x + 1)。所以,这个函数可以把任意整数x映射为x + 1。

函数值是对象,所以如果你愿意,可以将其存入变量它们(定义的变量)也是函数,所以你可以使用通常的括号函数调用写法调用它们。如例:

213535_O5kg_168814.jpg

上例中,因为increase是var,你可以随后再重新赋给它不同的函数值。如例:

213802_vFpP_168814.jpg

如果你想让函数字面量包含多条语句,可以用花括号包住函数体。与方法一样,当函数值被调用时,所有的语句将被执行,而函数的返回值就是最后一行表达式产生的值。如例:

object Test1 {    def main(args:Array[String]):Unit = {        val increase = (x:Int) => {            println("WE")            println("ARE")            println("HERE")            x + 1        }        println(increase(10))    }}

现在你已经看到了有如螺丝和螺帽的函数字面量和函数值。许多scala库给你使用它们的机会。例如,所有的集合类都能用到foreach方法,它以函数作为入参,并对每个元素调用该函数。如例:

214539_hULD_168814.jpg

结果:

214715_hkSW_168814.jpg

另举一个例子,关于集合类型的filter方法。这个方法选择集合类型里可以通过用户提供测试的元素。测试是通过调用作为入参的函数实现的。例如,函数(x:Int) => x > 0可以用来作过滤:

215104_1BDA_168814.jpg

结果:

215213_0h5c_168814.jpg

转载于:https://my.oschina.net/fhd/blog/276550

你可能感兴趣的文章
centos7的单用户模式和救援模式修改root密码。
查看>>
iptables的备份和恢复、firewalld的9个zone、firewalld关于zone的操作
查看>>
第一节作业 飞机游戏体会 150206118
查看>>
事情做到极致就是专业化市场化商业化
查看>>
java之IO其它类型的流
查看>>
C言语模块化开辟(多文件编程)
查看>>
实例:使用puppeteer headless方式抓取JS网页
查看>>
关于近期selenium+java的一些总结
查看>>
Linux下怎么使用任务管理器和进程管理
查看>>
Bytom合约预编译
查看>>
如何将两个Redis主备实例建立全球灾备
查看>>
副高职称论文发表费用
查看>>
好程序员web前端分享Vue学习笔记(一)
查看>>
第二届“强网”拟态防御国际精英挑战赛即将开赛
查看>>
电脑关机后鼠标指示灯还亮着的解决
查看>>
我的友情链接
查看>>
Powershell获取Exchange 邮箱用户配额
查看>>
Winbox配置PPPOE的参数
查看>>
GNU版本号命名风格
查看>>
分区时注意的细节问题
查看>>