[Scala基础]--call by name和call by value的区别

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/

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事随风ing

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值