Scala 的 "匿名函数"与 "闭包"!
来源:互联网 发布:陈楠wnba数据 编辑:程序博客网 时间:2024/06/04 17:47
有这样一个函数, 它接受一个函数(或者说闭包)作为参数:
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数组的一个方法.
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数组的一个方法.
0 0
- Scala 的 "匿名函数"与 "闭包"!
- Scala 闭包 匿名函数
- javascript的匿名函数与闭包
- 匿名函数与闭包的区别
- 匿名函数与闭包的区别
- 匿名函数与闭包的区别
- 匿名函数与闭包
- 闭包与匿名函数
- 闭包与匿名函数
- Scala的匿名函数!
- Scala 函数与匿名函数
- Js的匿名函数与闭包特性
- javascript 闭包(closure) 与匿名函数的this
- php匿名函数与闭包的简单使用
- Go语言的匿名函数与闭包
- Javascript 匿名函数与闭包
- js:匿名与闭包函数
- JS之匿名函数与闭包
- ztree使用教程 异步
- 安装AndroidStudio时,需要注意的问题
- Java源码分析之LinkedList
- 解决魅族手机listview等下拉出现hold字样的问题
- Oracle Sequence创建与使用
- Scala 的 "匿名函数"与 "闭包"!
- HDU 1147 Pick-up sticks(线段相交)
- java 泛型详解
- Spark批量写数据入HBase
- GEOSQL存储机制导致的效率问题
- C++ 构造函数和New运算符
- 导数与积分入门
- nodejs+mysql+css项目1
- android 文档