介绍Scala的第一类函数

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第八章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

Scala拥有***类函数:first-class function。你不仅可以定义函数和调用它们,还可以把函数写成没有名字的文本:literal并把它们像值:value那样传递。我们在第2章介绍了函数文本并在第42页的图2.2里展示了基本语法。

51CTO编辑推荐:Scala编程语言专题

函数文本被编译进一个类,类在运行期实例化的时候是一个函数值:function value任何函数值都是某个扩展了若干scala包的FunctionN特质之一的类的实例,如Function0是没有参数的函数,Function1是有一个参数的函数等等。每个FunctionN特质有一个apply方法用来调用函数。因此函数文本和值的区别在于函数文本存在于源代码,而函数值存在于运行期对象。这个区别很像类(源代码)和对象(运行期)的那样。

以下是对数执行递增操作的函数文本的简单例子:

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

函数值是对象,所以如果你愿意可以把它们存入变量。它们也是函数,所以你可以使用通常的括号函数调用写法调用它们。以下是这两种动作的例子:

scala> var increase = (x: Int) => x + 1 
increase: (Int) => Int = < function>  
scala> increase(10)  
res0: Int = 11 
  • 1.
  • 2.
  • 3.
  • 4.
本例中,因为increase是var,你可以在之后重新赋给它不同的函数值。

scala> increase = (x: Int) => x + 9999 
increase: (Int) => Int = < function>  
scala> increase(10)  
res2: Int = 10009 
  • 1.
  • 2.
  • 3.
  • 4.
如果你想在函数文本中包括超过一个语句,用大括号包住函数体,一行放一个语句,就组成了一个代码块。与方法一样,当函数值被调用时,所有的语句将被执行,而函数的返回值就是***一行产生的那个表达式。

scala> increase = (x: Int) => {  
        println("We")  
        println("are")  
        println("here!")  
        x + 1 
       }  
increase: (Int) => Int = < function>  
scala> increase(10)  
We  
are  
here!  
res4: Int = 11 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
于是现在你已经看到了有如螺丝和螺帽的函数文本和函数值。许多Scala库给你使用它们的机会。例如,所有的集合类都能用到foreach方法。foreach方法被定义在特质Iterable中,它是List,Set,Array,还有Map的共有超特质。它带一个函数做参数,并对每个元素调用该函数。下面是如何用它打印输出所有列表元素的代码:

scala> val someNumbers = List(-11, -10, -50510)  
someNumbers: List[Int] = List(-11, -10, -50510)  
scala> someNumbers.foreach((x: Int) => println(x))  
-11 
-10 
-5 
0 
5 
10 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
另一个例子是,集合类型还有filter方法。这个方法选择集合类型里可以通过用户提供的测试的元素。测试是通过函数的使用来提供的。例如,函数(x: Int) => x > 0可以被用作过滤。这个函数映射正整数为真,其它为假。下面说明如何把它用作filter:

scala> someNumbers.filter((x: Int) => x > 0)  
res6: List[Int] = List(510)  
  • 1.
  • 2.

像foreach和filter这样的方法将在本书后面描述。

【相关阅读】

  1. Scala的本地函数:将私有方法转换为本地方法
  2. Scala中定义函数的方法:method
  3. 继续领悟函数式:Scala指令式风格代码的重构
  4. 学习Scala的变量范围
  5. Scala:match表达式、break和continue

责任编辑:book05 来源: Artima
相关推荐

2009-09-24 09:38:00

Scala讲座第一类对象scala

2010-01-19 09:50:54

Java 7闭包

2009-12-11 10:42:00

Scala讲座类定义构造函数

2015-05-27 10:21:55

光纤光通信

2010-02-25 16:00:23

驱动程序

2010-02-02 10:33:51

Python

2009-06-17 11:58:19

Linux

2009-07-22 07:42:00

Scala偏应用函数

2017-03-07 15:13:28

Scala偏函数函数

2009-08-04 15:58:06

ASP.NET动态控件

2021-04-20 09:44:42

CSS函数选择器

2009-07-22 07:53:00

Scala扩展类

2009-07-08 15:35:18

Case类Scala

2009-07-30 13:21:17

Scala入门Hello World

2009-07-22 07:57:00

ScalaCurry化函数

2009-06-16 17:54:38

Scala类语法语义

2009-07-22 09:31:59

Scala类类层级Java类

2011-06-28 11:06:16

Scala

2009-09-09 11:37:08

Scala的模式匹配

2009-07-21 17:21:57

Scala定义函数
点赞
收藏

51CTO技术栈公众号