您的位置:首页 > 其它

Scala之旅-高阶函数

2016-04-06 17:36 232 查看
1.函数作为参数

对某对象进行什么样的操作暂时保留,之后让你来定义。这类似于Java中的内部类机制,如果你熟悉C#的委托,这就再也简单不过了。

//1.函数作为参数
//对a具体进行什么操作不知道,让fun来完成
def getResult(fun: Int => Int, a: Int): Int = {
fun(a)
}
def mul(x: Int) = 2 * x
def demo01(): Unit = {
//使用声明的函数---1040
println(getResult(mul, 520))
//使用匿名函数(lamda表达式)----521
println(getResult(x => x + 1, 520))
}


2.函数作为返回值

//2.函数作为返回值
def add01(a:Int)=(b:Int)=>a+b //注意a

def demo02(): Unit ={
val add02=add01(5) //add01返回一个函数b=>5+b
println(add02(3)) //结果:8  为什么5被留下来,涉及到闭包
}


3.闭包

具体什么是闭包,这篇文章说的很详细:http://developer.51cto.com/art/200907/138439.htm

简单粗暴:一个变量在函数(lamda表达式)中使用 (呵呵,我在用委托避免参数传递时,经常这样做)

def demo03(): Unit ={
val more=1
val add=(x:Int)=>x+more //more是函数外的东西
println(add(1))

}


4.柯里化

之前看柯里化总是云里雾里,但是在看完函数作为参数和闭包后,总茅塞顿开了。

简单来说,柯里化就是一个函数作为参数的简写。 套用2中的例子

//2.函数作为返回值
def add01(a:Int)=(b:Int)=>a+b //注意a

def demo02(): Unit ={
val add02=add01(5) //add01返回一个函数b=>5+b
println(add02(3)) //结果:8  为什么5被留下来,涉及到闭包
}
其等价的柯里化

//柯里化
def demo04(): Unit ={
//其实就是把demo2的中间参数省略了 add01(5)还是一个函数
println(add01(5)(3)) //8
}

其实add01还可以简写如下

def add01(a:Int)(b:Int)=a+b


5.抽象控制

神马叫抽象控制? 说白了就是把函数做为参数或者返回值。下面看下scala中使用java线程的案例

第1版:

//使用java里面的线程,无缝结合
def runInThread(fun: () => Unit): Unit = { //参数是一个函数,它没有参数和返回值
new Thread() {
override def run(): Unit = {
fun()
}
}.start()  //完全是java的内容
}

//测试代码,无规则交替输出了T1 T2 T3的相应值
def demo(): Unit ={
for (i <- 1 to 3)
runInThread(() => {
Range(1, 100).foreach(x => println("T" + i + " " + x))
})
}


第2版,如果作为参数的函数是无参的类型,可以简写如下

def runInThread01(fun: => Unit) { //这里去掉了()
new Thread() {
override def run(): Unit = {
fun
}
}.start()
}

def main(args: Array[String]) {
for (i <- 1 to 3)
runInThread01 (
Range(1, 100).foreach(x => println("T" + i + " " + x)) //这里去掉了() => {}
)
}


Tip:调用runInThread或runInThread01的时候,我使用的都是 runInThread(.....),因为本人之前习惯了C#的lamda表达式的写法,书上的写法是runInThread{.....}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: