scala版本:scala-2.10.5
一、前言
这里涉及到Scala的匿名函数、高阶函数、闭包和Jvm相关的知识,有关内容请查阅这本pdf书籍:
Scala Cookbook - Recipes for Object-Oriented and Functional Programming_Alvin Alexander_2013
在Spark的源码中,大量使用call by name 的调用,减少了函数的调用次数,大大提高了软件性能。
二、举例
- func():返回值是Int,没有参数
- callByValue(x:Int):返回值是Unit,传入Int类型的值
- callByName(x:=>Int):返回值是Unit,传入的是一个匿名函数(该函数传入的参数为空,返回值是Int)
def func(): Int ={
println("Compute some stuff...")
23 // return value
}
def callByValue(x:Int)={
println(s"1 first : $x ")
println(s"2 second : $x ")
}
def callByName(x: => Int)={
println(s"1 first : $x ")
println(s"2 second : $x ")
}
test("2018年5月23日14:16:30 测试call by name 和call by value的区别"){
callByName(func())
println("---------------------------------")
callByValue(func())
}
运行结果:
Testing started at 14:31 ...
Compute some stuff...
1 first : 23
Compute some stuff...
2 second : 23
---------------------------------
Compute some stuff...
1 first : 23
2 second : 23
现象:
1、callByName:func()被调用了2次
2、callByValue:func()被调用了1次
区别:
1、call-by-name:在调用函数时计算的(即需要时,才会调用)。
2、call-by-value:在调用函数时就预先计算了。
参考:https://www.geeksforgeeks.org/scala-functions-call-by-name/