`

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编程_中文高清完整版附带案例源码

    第8章,“函数和闭包”,深度讨论了函数式语言的基础建设模块,函数。 ...... 第31章,“组合子解析”,显示了如何使用Scala的解析器组合子库来创建解析器。 第32章,“GUI编程”,展示了使用Scala库简化基于Swing的...

    Scala程序设计(第2版)

    6.2.1 匿名函数、Lambda与闭包 152 6.2.2 内部与外部的纯粹性 154 6.3 递归 154 6.4 尾部调用和尾部调用优化 155 6.5 偏应用函数与偏函数 157 6.6 Curry化与函数的其他转换 158 6.7 函数式编程的...

    SCALA从入门到精通个人笔记含代码

    目录如下 Scala简介&快速入门 基础语法 变量 数据类型 流程控制 操作符重载 模式匹配 函数式编程基础 函数式编程说明 函数定义/声明 ... 闭包closure 柯里化函数 控制抽象 递归高级 Akka 介绍

    ignite-scala:用于 Apache Ignite 上的分布式闭包的 Scala API

    用于上的分布式闭包的 Scala API。 灵感来自。 示例 0 - 集群设置 import org . apache . ignite . _ import org . apache . ignite . configuration . _ import ignite . scala . _ val cfg = new ...

    快学 scala 中文版 带完整目录

    12.6 闭包 181 12.7 SAM转换 182 12.8 柯里化 183 12.9 控制抽象 185 12.10 return表达式 186 练习 187 第13章 集合 A2191 13.1 主要的集合特质 192 13.2 可变和不可变集合 193 13.3 序列 195 13.4 列表 ...

    leetcode分类-leetcode-scala:力码量表

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT Scala warm-up: Keywords or tags 列表解析式 函数一等公民 鸭子类型 尾递归 代数类型 模式匹配 伴生对象 Non-...

    metal:Metal-Scala的快速拆箱数据结构

    内联循环主体,避免分配闭包; Scala迭代器被指针取代,指针由不需要分配的值类表示; 可变容器可用作不可变容器的构建器。 该库在很大程度上受到启发。 实现的某些部分是相似的(例如,哈希集和映射的策略)。 ...

    浅谈PHP 闭包特性在实际应用中的问题

    译注:原文作者比较火星,我不了解 Groovy 以及 Scala 语言,所以这里我加上 Javascript 的实现。 在开始之前先说明下,本例子仅仅是阐明观点,并没有考虑性能等其他方面的因素。 “货比三家” 用个简单的例子开始...

    孢子:Scala孢子,安全的移动式封闭

    Spores是Scala编译器的扩展,可以在并发和分布式环境中更安全地使用闭包。 它使开发人员可以保证基于类型的功能属性,从而可以更好地控制功能环境。 Spores带有传递检查器,以确保JVM可以对捕获的类型进行序列化...

    leetcode分类-LeetCode:大楼能建多高,取决于地基挖有多深

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT 自己一点练习,总结理论,是不是有些效率低下,还是找一本书(无论线上和线下)通读一遍,效率更高,做练习,...

    leetcode电脑下载-myLogs:我的日志

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT 自己一点练习,总结理论,是不是有些效率低下,还是找一本书(无论线上和线下)通读一遍,效率更高,做练习,...

    jdk-8u181-windows-x64.zip

    jdk1.8新特性,例如:Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对这...

    借贷管理源码java-embedded-kafka:一个提供内存Kafka实例来运行测试的库

    丑管理源码java 嵌入式卡夫卡 一个提供内存 Kafka 实例来运行测试的库。 灵感来自 . 版本兼容性矩阵 ...实例的代码包含在withRunningKafka闭包中。 一个例子,使用 ScalaTest: class MySpec extends An

    jgo:JGo - Golang 的 Java 编译器和运行时环境

    描述 旨在为 Java 虚拟机上的 Go 编程语言提供完整的编译器和运行时环境。 jgoc 编译器用 Scala 编写,运行时用 ... 闭包(lambda 表达式的子功能); 并发; 推迟、恐慌和恢复; 和 Switch 语句。 文档 贡献 为 JG

    做Java开发这一年

    从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有...前几天InfoQ上发表了一篇英国卫报逐步采用Scala替换Java的文章里一句话用的很好:看Java的代码很容易让你只见树木,不见森林

    javalruleetcode-Coding:记录编码问题、解决方案、解释、测试用例等

    C++、Java、Python、C#、Scala 目录 1. 数学 1.1 离散数学 1.1.1 图论 1.1.1.1 图遍历(BFS、DFS) 1.1.1.2 最小生成树(Prim、Kruskal) 1.1.1.3 最短路径(Dijkstra、Floyd) 1.1.1.4 最长路径 1.1.1.5 传递闭包 ...

Global site tag (gtag.js) - Google Analytics