函数和闭包之头等函数

什么是头等函数(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值