scala闭包

有这样一个函数, 它接受一个函数(或者说闭包)作为参数:

object Timer{
  def oncePerSecond(callback: () => unit): unit = {
    while (true){
      callback()
      Thread.sleep(1000)
    }
  }

  def timeFlies(): unit = { 
    Console.println("Time flies when you're having fun(ctionally)...");
  }

  def main(args: Array[String]): unit = {
    oncePerSecond(timeFlies)
  }
}

观察函数oncePerSecond, 它的参数callback被定义为" () => unit", 表示callback接受一个函数, 并且这个函数
    1. 不能带参数; 因为"()"
    2. 返回值的类型为unit, 即没有返回值; 因为" => unit", "=>" 表示返回值, "unit"表示返回值的类型

再观察函数timeFlies, 它满足以上两个条件, 因此, 可以这么调用: oncePerSecond(timeFlies)




匿名函数

更进一步, 我们可以不用声明函数timeFiles, 而直接将它的主体作为参数传递给oncePerSecond:

  def timeFlies(): unit = { 
    Console.println("Time flies when you're having fun(ctionally)...");
  }

  进一步简化为匿名函数, 或者说是闭包, 或者说是code block:

  () => Console.println("Time flies when you're having fun(ctionally)..."


  调用匿名函数:

  oncePerSecond(() => Console.println("Time flies... oh, you get the idea."))




更典型的例子


观察下面的scala代码:

object HelloWorld{
  def main(args: Array[String]): unit = {
    args.filter( (arg:String) => arg.startsWith("G") )
        .foreach( (arg:String) => Console.println("Found " + arg) )
  }
}


1. 函数main的参数是Array类型的String数组 args: Array[String]
2. Scala数组有一个方法filter, 方法filter(b)返回一个符合某个条件b的数组
   
    args.filter( (arg:String) => arg.startsWith("G") )

   和上面的匿名函数一样, 红色部分也是一个匿名函数, 不同的是, 该函数接受一个String值,并且返回一个boolean值:
    
    (arg:String) => arg.startsWith("G") 

    在args.filter()函数的圆括号内, arg:String 表示枚举args中的每一个值. arg.startsWith("G")是Java的String类型的函数, 因此, 这个匿名函数的含义是:
    从args中, 返回一个字符串数组, 并且这个字符串数组的字符串,都是以字符"G"开头的.

   和args.filter()一样, foreach也是Scala数组的一个方法. 

 

 

 

http://www.blogjava.net/byterat/archive/2008/05/30/204099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值