hangscer

函数值和闭包

2017/02/11

6.函数值和闭包

6.2 函数值

函数值 函数字面值 函数是对象 把函数作为参数就是高阶函数

6.4 Curry化

将多个参数转化为多个参数列表

1
2
3
def foo(a:Int,b:Int,c:int)={}
//经过Curry化
def foo(a:Int)(b:Int)(c:Int)={}

6.6 参数的位置记法(_)

用下划线(_)可以表示函数值(函数字面量)的参数。如果某个参数只使用一次,就可以用下划线表示

1
2
3
4
val array=Array(1,2,3,4,5,6)
println( ( 0/:array ){ (sum,ele)=>ele+sum } )
println( ( 0/:array ){ _+_ } )
//第一个_是函数调用过程中持续存在的值 第二个表示当前数组的元素

以上这个代码生硬晦涩
来个简单的 ,数组是否存在小于的元素

1
2
val array=Array(1,2,3,4,5)
println(array.exists(_<0))

代码不要写成密码

得到数组中最大值:

1
2
3
4
val array=Array(1,2,3,4,5)
println( (Integer.MIN_VALUE/:array){Integer.max(_,_)} )
//或者
println( (Integer.MIN_VALUE/:array){Integer.max} )

6.7 Execute Around Method模式

自己感悟

6.8 偏应用函数

一个函数需要传入多个参数,可以只绑定部分实參,得到偏函数。

1
2
3
4
5
6
def log(date:Date,message:String)={}
//<function2>
val logWithDateBound=log(new Date,_:String)
//这是个偏函数
println(logWithDateBound)
//<function1>

在创建偏应用函数时,Scala内部创建了一个新类,它有一个特殊的apply方法。

6.9 闭包

某些函数可在局部范围和参数列表之外绑定变量,这些函数称为闭包