`

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

分享到:
评论

相关推荐

    Scala 闭包

    Scala 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i ...

    Scala函数和闭包.md

    Scala函数和闭包

    scala sdk scala-2.12.3

    同时,Scala还提供了函数式编程的关键概念,如高阶函数、闭包和柯里化。 10. **Actor模型**:Akka库是Scala中的并发和分布式计算框架,基于Actor模型,使得编写高性能、容错的应用程序变得简单。 11. **Dotty/...

    4399大数据笔试题.pdf

    三、Scala闭包知识点 7. Scala的闭包描述:没有给出具体错误选项,闭包是具有自由变量的函数,能够记住其定义时的作用域环境,常用于函数式编程,提供代码复用和延迟计算等功能。 四、Kafka高吞吐原因 8. Kafka高...

    大数据面试问题

    四、Scala闭包:闭包是指能够访问其自身作用域及外部作用域变量的函数,即使在其定义的外部环境中执行。 五、Spark提交任务时的参数配置:例如,`--master`定义Spark运行模式,`--executor-memory`指定Executor内存...

    scala2.12.1Windows镜像包

    并支持高阶函数、柯里化、闭包等概念。 - **模式匹配**:强大的模式匹配机制,用于解构复杂数据结构。 - ** Actors模型**:Scala内置对Akka框架的支持,允许并发编程时使用Actors模型,简化了并发控制。 2. **...

    scala-2.12.10.tgz

    7. 函数式编程:Scala支持高阶函数、闭包和不可变数据结构,这些都是函数式编程的核心特性。这使得编写并发程序更加安全和高效。 8. 面向对象编程:Scala是面向对象的,支持类、接口、继承和多态。它还引入了特质...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.11.12 win msi 安装包

    4. **函数式编程**:Scala深受函数式编程语言如Lisp和Haskell的影响,支持高阶函数、闭包、不可变数据结构以及模式匹配等功能。 5. **类型推断**:Scala的类型系统能自动推断许多变量和表达式的类型,减少了代码的...

    学习scala好的项目

    此外,可能会涉及到的高级主题包括Akka(一个用于构建高度并发、分布式的应用程序的框架),以及Scala的函数式编程特性,如高阶函数、柯里化、闭包和Monad。对于想要深入了解Scala的人来说,这些内容是必不可少的。 ...

    scala中文教程(java 平台开发语言 scala 简单教程)

    5. **函数与闭包**:Scala支持定义无状态或有状态的函数,并且允许函数捕获其定义环境中的变量,即闭包。闭包是函数式编程中的一个重要概念。 6. **控制抽象**:Scala提供了一些高级的控制抽象机制,如`map`、`...

    开发人员的Scala指南

    - **闭包**:Scala支持闭包,即函数可以访问其外部作用域中的变量。这一特性在处理状态变化和依赖管理时非常有用。 - **偏函数与模式匹配**:Scala引入了偏函数和模式匹配的概念,使得处理特定情况下的条件分支变得...

    scala-2.12.11.zip

    3. **函数式编程**:Scala深受函数式编程语言如Lisp和Haskell的影响,支持高阶函数、闭包、不可变数据结构和尾递归等特性。 4. **面向对象编程**:Scala也是面向对象的,支持类、对象、继承、封装和多态。特别的是...

    programming in scala, 3nd edition

    - **高阶函数与闭包**:支持函数式编程的关键概念,允许将函数作为参数传递给其他函数,或者作为返回值。 - **模式匹配**:提供强大的模式匹配功能,使得代码更加简洁和易于理解。 - **并发模型**:通过actor模型来...

    Scala编程书合集

    书中可能包括变量和常量的声明、模式匹配、类型系统、类和对象的设计、函数式编程概念如高阶函数和闭包,以及Scala中的并发处理。此外,它还可能讨论如何利用Scala的Actor模型进行分布式计算,以及如何与其他Java或...

    Scala编程 pdf

    λ表达式(匿名函数)和闭包也是重要的概念。 5. **类型推断**:Scala具有强大的类型推断能力,程序员在编写代码时可以减少显式的类型声明,提升代码的简洁性。 6. **集合库**:Scala的集合库非常强大,提供了各种...

    scala入门精华讲义

    3. 闭包:闭包是能够访问其自身作用域外变量的函数,这是函数式编程中的一个重要概念。 四、Spark与Scala结合 1. RDD(弹性分布式数据集):Spark的核心数据结构,是可分区的、只读的、容错的数据集合。Scala的API...

    scala编程电子书

    8. 函数和闭包:函数是Scala语言的核心概念之一,Scala支持高阶函数、函数字面量、闭包等特性。 9. 控制抽象:Scala允许开发者定义新的控制结构,类似于控制抽象,来使代码更加简洁和易于理解。 10. 组合与继承:...

    快学Scala课后习题答案

    6. **函数式编程**:Scala的函数式编程特性包括柯里化、尾递归、闭包和monads等。例如,`f.curry` 将一个接受两个参数的函数转换为接受一个参数并返回另一个函数的形式。 7. ** Actors模型**:Scala提供了内置的...

Global site tag (gtag.js) - Google Analytics