控制抽象
1. 本章作用:减少重复的代码。
2. 高阶函数:将一个函数作为其他函数的参数传递。为了减少重复代码。
2.1 书上的代码示例太墨迹,自己写个例子。
第一步,先看两个函数:
def sum(a: Int,b: Int, c: Int) = a + b + c; //将三个整数相加
def dec(a: Int, b:Int, c: Int) = a - b - c; //将三个整数相减
第二步,再创建一个函数,接收上面两个函数作为他的参数:
deffunManager(fun: (Int, Int, Int) => Int) = {
fun(1,2,3);
}
注:funManager接收一个函数类型的参数,定义参数fun,这个参数的类型就是sum和dec类型。
funManager函数体内,会调用传递进来的函数。
第三步,测试:
同样,也可以把dec作为参数传递到funManager函数中。
注:funManager时,不能够直接传递sum函数的名字,而是要把函数传递进去。即:sum _ 或者 sum(_, _, _)。为什么是这么写,可以参考第八章的偏应用函数。
2.2 这种写法,在集合里有很多,如exists方法。
2.3 个人感受:可以发现,这种传递参数的做法,类似于java里传递接口,然后调用接口里定义的方法。只要把对函数的调用定义到一个单独的类中,就很像策略模式。
简单实现一下:
第一步,定义一个类:
classHandleValue(a: Int, b: Int, c: Int) {
//这不就是策略模式的变相实现么!!!
def calculate(fun: (Int, Int, Int) => Int)= {
fun(a, b, c);
}
第二步,定义一个调用的Object:
objectSumTest2 {
def main(args: Array[String]) {
//提供加、减两个函数
def sum(a: Int, b: Int, c: Int) = a + b + c;
def dec(a: Int, b: Int, c: Int) = a - b - c;
val v = new HandleValue(1,2,3);
println(v.calculate(sum _));
}
}
第三步:运行后OK。
3. Curry化:传统的函数名后,只带一个括号“()”,curry表示不止一个“()”。
def plainOldSum(x: Int, y: Int) = x+ y; //一个“()”
def curriedSum(x: Int)(y: Int) = x+ y; //两个“()”
注:具体用途,暂时不懂。很重要的一个性能!
4.