1.=>

在了解Scala的By-Name参数之前,先了解下“=>”在Scala中有几种用法:

1.对于值,“=>”相当于lambda表达式。如:

scala> List(1,2,3).map{(x: Int) => x*2}
res0: List[Int] = List(2, 4, 6)

2.对于类型,“=>”两端的类型(如,A => B、(A, B) => C等)。它对于Function<n>[A[, B...], T]是一个语法糖。一个函数传入参数是A[, B...],并且返回一个T类型的值。如:

scala> val test: Function1[Int,String] = myInt => "my int: " + myInt.toString
test: Int => String = <function1>
scala> test(1)
res0: String = my int: 1scala> val test: Int => String = myInt => "my int: "+ myInt.toString
test: Int => String = <function1>scala> test(1)
res1: String = my int: 1

  • 如果参数为空,即“=>”左边为空,形式是:() => T。如

    scala> val test: Function0[String] = () => "Hello"
    test: () => String = <function0>scala> test()
    res3: String = Helloscala> val test: () => String = () => "Hello"
    test: () => String = <function0>scala> test()
    res4: String = Hello

如果无返回值,即“=>”右边为空,形式是:A[, B...] => Unit

    1. scala> val test: Int => Unit = myInt => println(myInt)
    2. test: Int => Unit = <function1>
    3. scala> test(1)
    4. 1
  • 如果无参且无返回值,即“=>”两边都为空,形式是:() => Unit
    1. scala> val test: Function0[Unit] = () => println("Hello")
    2. test: () => Unit = <function0>
    3. scala> test()
    4. Hello
    5. scala> val test: () => Unit = () => println("Hello")
    6. test: () => Unit = <function0>
    7. scala> test()
    8. Hello

3.如果作为一个函数的参数的类型声明,且左边没有任何符号,如def func(param: => T)。这种形式叫做By-Name parameter。

4.在case语句中,“=>”用于分隔模式和结果表达式。

2.By-Name Parameter

By-Value参数,我们都比较熟悉,参数在进入函数前就进行计算,最后传入的最终的计算结果。
By-Name参数,表示参数在进入函数后,每次在函数体内调用的时候才会计算。

def myByName1(param: () => Boolean): Unit = {println("start")println(param) //println(param.apply())也可以

println("end")}//要实现传名函数,要定义的类型开始于“=>”,而不是“() =>”。//myByName1{7>9}不会有效,因为缺少“() =>”

myByName1{() =>println("enter")7 > 9}

其中“=>”后面的代码是整体作为参数,所以会在函数体里被调用的时候才会执行。输出如下:

startenterfalseend

再看下一种情况,只有“() =>”之后的代码是By-Name参数。“() =>”之前的代码是By-Value参数,即当调用myByName2的时候就会立即执行:

  1. def myByName2(param: () => Boolean): Unit = {
  2. println("start")
  3. println(param) //println(param.apply())也可以
  4. println("end")
  5. }
  6. myByName2{
  7. println("enter")
  8. () => 7 > 9
  9. }

输出如下:

  1. enter
  2. start
  3. false
  4. end

下面来看标准的By-Name参数:

  1. def myByName(param: => Boolean): Unit = {
  2. println("start")
  3. println(param)
  4. println("end")
  5. }
  6. myByName{
  7. println("enter")
  8. 7 > 9}

3.函数作为参数

By-Name有点像把函数作为参数的意思,但是实际上却不是。这里看下把函数作为参数的形式:

  1. def test(num: Int => String, str: String => Int): Unit = {
  2. val i = 10
  3. val s = "5"
  4. println(num(i))
  5. println(str(s))
  6. }
  7. def num(x: Int): String = {
  8. x.toString()
  9. }
  10. def str(s: String): Int = {
  11. s.toInt
  12. }
  13. test(num, str)

Scala传名参数(By-Name)相关推荐

  1. Scala 传名参数和传值参数

    Scala 传名参数和传值参数 传名参数 call-by-name 传值参数 call-by-value 在Scala中,当参数通过传值调用函数时,它会在调用函数之前计算一次传入的表达式或参数值.但是 ...

  2. Scala 传名参数、注解

    传名参数 传名参数仅在使用时求值.在类型之前添加=>,即可令参数为传名参数. 定义传名参数 def ggg(kkk: => Int) = kkk * 999 传名参数的优势在于,如果函数体 ...

  3. Scala学习笔记——传名参数和传值参数

    Scala传名参数和传值参数 文章目录 `Scala`传名参数和传值参数 `1.` 定义 `2.` 两者的比较 `3.` 自定义`while`循环 1. 定义 Scala的解释器在解析函数参数(fun ...

  4. scala的传名参数

    scala如果你想实现像if ,while等类似的控制结构,根本没有值要传入花括号{}直接的代码里.要怎么实现. 比如说,我们要实现一个断言的控制结构,myAssert(), myAssert函数参考 ...

  5. scala的传名参数和传值参数

    传名参数 传值参数 因为Scala建议如果函数的参数只有一个,可以考虑使用{}代替(),因此test和test1的调用都是{},又因为test的参数是传名参数函数,因此传入的参数是不会被执行的,而te ...

  6. scala控制抽象之传名参数(名调用)

    我们在用scala定义函数时,一般参数都是各种类型的值,这是常见的值调用 但偶尔也有需要把代码块作为参数传入的情况(名调用) 匿名函数经常可以作为函数的参数传入,非匿名函数也行(函数作为返回值返回就更 ...

  7. 【值传递和引用传递之外的第三种传值方式 - 传名参数】

    引言 先看下Scala 的以下方法该如何调用那? class Demo {val assertIsOpen = truedef test(isTrue: () => Boolean): Unit ...

  8. scala 柯里化+传名参数+递归 实现while关键字功能

    目录 代码实现 解读 代码实现 object Lambda {def main(args: Array[String]): Unit = {def myWhile(condition: => B ...

  9. scala的传值参数和传名参数

    object ScalaDemo extends App{var n = 10def count:Int = {n -= 1n}def invokeByName(x : => Int):Unit ...

最新文章

  1. displaytag 导出
  2. 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力!
  3. R语言数据结构之矩阵
  4. JAVA中栈和堆总结
  5. linux基础学习(九)
  6. 服务稳定性及应用防护方案
  7. oracle 10g 关库,Oracle Db10g 启动和关闭数据库
  8. supervisord的安装使用
  9. 循环次数几次_圆柱模板循环使用次数是多少呢
  10. asyncio oracle 异步,带有asyncio futures和RuntimeError的InvalidStateError与aiohttp时使用期货回调...
  11. oracle 数据结构部署,
  12. MySQL 8.0中的JSON增强
  13. 得罪全球首富的下场?曝光贝佐斯婚外情丑闻的小报将被卖身...
  14. 检索召回 技术综述!
  15. 谁爱谁都没有错... ...
  16. 制造业案例 | 美创助力纳爱斯集团三层业务安全审计实践
  17. ps证件照白底换蓝底_【插件】PS插件证件照V2.0一键裁剪排版磨皮换装换底色软件2020Mac/Win完整版...
  18. 多目标优化系列(四)RM-MEDA
  19. 四、AOSP-开机报错
  20. [科研]本科生毕业论文查重网站汇总

热门文章

  1. 在sdk中添加源文件_实用干货 | 一步一步教你在SpringBoot中集成微信刷卡支付
  2. 脑科学与脑电基础知识汇总
  3. JStorm与Storm源码分析(八)--计时器工具-mk-timer
  4. [CES 2018] TPCast发布升级版本,将支持微软MR设备
  5. 不出声也能命令Siri!康奈尔大学华人团队开发无声语言识别项链,中文英文都行...
  6. 万万没想到,钉钉居然是个AI平台
  7. Google人体图像分割模型Bodypix再次更新,针对Coral开发板优化,720p/30fps流畅运行...
  8. 程序员硬核劝告:现在还不是出门的时候
  9. 170多个Ionic Framework学习资源(转载)
  10. 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?...