31.scala编程思想笔记——作为对象的函数
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50445775
源码下载连接请见第一篇笔记。
我们可以将方法以对象的形式作为参数传递给其他方法。需要使用函数对象来打包方法,函数对象常简称为函数。
例如,foreach对于像Vector这样的序列来说是一个非常有用的方法。
接受参数(即一个函数),并将其应用到序列中的每个元素上。
例如:
def show(n:Int):Unit = { println("> "+n) }
val v = Vector(1, 2, 3, 4)
v.foreach(show)
执行如下:
> 1
> 2
> 3
> 4
方法是依附于类或对象的,而函数是其自身的对象。
将show当作一个函数进行传递时,scala会自动将其转换为函数对象,这称为提升。
当作参数传递给其他方法或函数的函数通常都非常小,而且非常只使用一次。对于强制创建具名方法然后将其当作参数传递这种做法,看起来会给程序员带来额外的工作量。通常可以定义一个匿名函数。
将show转换为匿名函数并直接将其传递给foreach,ruxia
(n:Int) => {println(“>” + n)}
可以继续简化,移除大括号。
如下:
val v = Vector(1, 2, 3, 4)
v.foreach(n => println("> " + n))
输出如下:
> 1
> 2
> 3
> 4
也可以应用于其他类型的序列如下:
val duck = "Duck".toVector
duck.foreach(n => println("> " + n))
也可以将结果保存到字符串中,如下:
import com.atomicscala.AtomicTest._
var s = ""
val duck = "Duck".toVector
duck.foreach(n => s = s + n + ":")
s is "D:u:c:k:"
此外,具有0个参数也可以是匿名的。例如:
class Later(val f: () => Unit) {
defcall():Unit = { f() }
}
val cl = new Later(() => println("now"))
cl.call()
定义了一个类,接受一个具有0个参数的函数作为参数,然后在后续调用该函数。
无任何参数、=>、和unit合起来表示不返回任何信息。
甚至可以将匿名函数赋给一个var或val:
val later1 = () => println("now")
var later2 = () => println("now")
later1()
later2()
输出如下:
now
now
可以在任何使用常规函数的地方使用匿名函数,如果该匿名函数变得过于复杂,最好定义一个具名函数。