Scala之旅-高阶函数

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{.....}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值