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.
函数值是对象,所以如果你愿意可以把它们存入变量。它们也是函数,所以你可以使用通常的括号函数调用写法调用它们。以下是这两种动作的例子:
scala> var increase = (x: Int) => x + 1
increase: (Int) => Int = < function>
scala> increase(10)
res0: Int = 11
- 1.
- 2.
- 3.
- 4.
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> val someNumbers = List(-11, -10, -5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.foreach((x: Int) => println(x))
-11
-10
-5
0
5
10
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
scala> someNumbers.filter((x: Int) => x > 0)
res6: List[Int] = List(5, 10)
- 1.
- 2.
像foreach和filter这样的方法将在本书后面描述。
【相关阅读】