Scala教程(十)函数与闭包详解
1 函数
1.1 本地函数
函数式编程风格的一个重要设计原则:程序应该被解构成若干小的函数,每个完成一个定义良好的任务。单个函数经常很小。这种风格的好处是它给了程序员许多可以灵活组装成更复杂事物的建造模块。每个小块应该充分简化到足以单独理解。
Scala中提供了可以把函数定义在另一个函数中。就好象本地变量那样,这种本地函数仅在包含它的代码块中可见。
def processData(fileName:String,width:Int){
// 本地函数
def processLine(line:String){
// 长度大数指定的长度,进行打印
if(line.length() > width){
println(fileName+":"+line)
}
}
// 读取文件
val source = Source.fromFile("E:\\input.txt");
for(line <- source.getLines()){
processLine(line);
}
}
processLine的定义放在processFile的定义里。作为本地函数,processLine的范围局限于processFile之内,外部无法访问。
1.2 函数值
函数文本被编译进一个类,类在运行期实例化的时候是一个函数值:function value。因此函数文本和值的区别在于函数文本存在于源代码,而函数值存在于运行期对象。
// =>指明这个函数把左边的东西(任何整数x)转变成右边的东西(x + 1)。所以,这是一个把任何整数x映射为x + 1的函数。
var increase = (x:Int) => x+1;
// 执行结果:11
println(increase(10))
// 因为increase是var,你可以在之后重新赋给它不同的函数值。
increase = (x: Int) => x + 9999
// 执行结果:10009
println(increase(10));
// 所有的集合类都能用到foreach方法。
val someNumbers = List(-11, -10, -5, 0, 5, 10)
someNumbers.foreach((x: Int) => println(x))
输出结果:
-11
-10
-5