看akka源码的时候看到这样的一个用法:

作为接触scala两天半的我有些看不明白了。好一番搜索看到这样的答案:

《scala雾中风景(2): 小括号与花括号》

下面的问题,表面上看是小括号与花括号的问题。

// map方法这样写不能编译通过

scala> List(2).map( case 2 => "OK" )

// 换做花括号就可以了

scala> List(2).map{ case 2 => "OK" }

不了解原因的话,觉得很诡异。分析一下,首先,map方法接受一个函数,这个函数将List中的元素映射为其他类型。

实际上case 2 => "OK" 不是一段lambda表达式(也就是说它不是函数),它是一段模式匹配语句。
那为什么在第二行可以编译通过呢?

稍微有点基础的话,会清楚方法的花括号有2种意思:
1)scala中函数的小括号,可以用花括号来表示,即foo{xx} 与 foo(xx)是一回事儿。(这里一回事是指函数的小括号)
2)对于只有一个参数的方法,其小括号是可以省略的,map(lambda)可写为 map lambda,即这块{case 2 => "OK"} 连同花括号整体是一个lambda(函数字面量)。

这个就是最上面的问题的答案了。

这儿显然是第2个(追究原因就要看编译器在语法解析式的优先级了,看样子把花括号对待为lambda字面量的一部分要高于把花括号当作小括号来对待),那么为什么加了花括号的{case 2 => "OK" }就可以当作一段函数字面量?

这要引出偏函数的概念,所谓偏函数(也叫部分函数)与完全函数想对应,普通的方法都是完全函数,即 f(i:Int) = xxx 是将所有Int类型作为参数的,是对整个Int集的映射;而偏函数则是对部分数据的映射,比如上面{case 2=> "OK" }就仅仅只对2做了映射。偏函数的实现都是通过模式匹配来表达的。

scala> val p:PartialFunction[Int,String] = { case 2 => "OK" }

因为偏函数是通过 { case x => y } 这种特殊的方式来描述的,上面的{case 2=>"OK"}就被当作了一段偏函数字面量,而偏函数背后的类型PartialFunction[A,B]是继承自Function1[A,B]的,所以将这段匿名的偏函数传给map方法是ok的。

小结:表达式 {case x=>y}会被当作偏函数字面量。

scala lambda 小括号与大括号的更多相关文章

  1. php正则:匹配(),{},[]小括号,大括号,中括号里面的内容

    php正则:匹配(),{},[]小括号,大括号,中括号里面的内容 比如有一段字符: $s='60c8 {"code":"200","message&q ...

  2. Linux Shell基础 单引号、双引号、反引号、小括号和大括号

    单引号和双引号 单引号和双引号用于变量值出现空格时将字符用引号括起来. 二者的主要区别在于, 被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义: 被双引号括起来的字符中,"$& ...

  3. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  4. shell中的括号(小括号,大括号/花括号)

    在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string ...

  5. Linux中的小括号和大括号,${}/$()/()/{}/${var:-string}/${var:=string}/${var:+string}/${var:?string}/${var%pattern}/${var#pattern}/${var%%pattern}/${var##pattern}

    简单记录一下大小括号在Linux中的用处. 1.${var},这是Linux中变量的原形.所以$var,别忘记了你的本来面目. # a= # echo $a # echo ${a} # echo ${ ...

  6. shell脚本中的几个括号总结(小括号/大括号/花括号)--from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html

    在Shell中的小括号,大括号结构和有括号的变量,命令的用法如下: 1.${var}2.$(cmd)3.()和{}4.${var:-string},${var:+string},${var:=stri ...

  7. shell中的大括号和小括号

      1.shell中的大括号和小括号   1.${var} 2.$(cmd) 3.() 和 {} 4.${var:-string}, ${var:+string},  ${var:=string}, ...

  8. JavaScript小括号、中括号、大括号的多义性

    语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...

  9. javascript小括号、中括号、大括号学习总结

    作为一名编程人员,和括号打交道是必不可少的.你可知道在不同的上下文中,括号的作用是不一样的,今天就让我们简单总结下javascript小括号.中括号.大括号的用法. 总的来说,JavaScript中小 ...

随机推荐

  1. 第一个ajax小demo

    第一个ajax小demo 文章来源:http://blog.csdn.net/magi1201/article/details/44569657

  2. [Codeforces166B]Polygons 凸包

    大致题意: 给你一个凸多边形A,和一个任意多边形B,判断B是否在A的内部 先对A的点集建凸包,然后枚举B中的点,二分判断是否在A的内部. 二分时可用叉积判断,详细见代码 #include<cst ...

  3. python并发编程-线程池

    from concurrent.futures import ThreadPoolExecutor import time def func(n): time.sleep(2) print(n) re ...

  4. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  5. cogs——2098. Asm.Def的病毒

    2098. Asm.Def的病毒 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就 ...

  6. Linux 下安装gmpy2

    GMP(GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数.实数.浮点数的高精度运算,还有 ...

  7. [JOBDU1172]哈夫曼树

    题目大意: 给你一堆权值,求这些权值建成哈夫曼树后的WPL. 思路: 哈夫曼树的WPL等于各非叶子结点权值之和. 所以直接贪心模拟构建哈夫曼树的过程. 先把所有的权值放在一个堆中,然后每次取里面最小的 ...

  8. 【BZOJ】2653: middle

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2381  Solved: 1340[Submit][Status][Disc ...

  9. 某DP题目2

    题意: 有一个栈,有n个数1~n按顺序插进栈中,但弹出顺序不定.另有m个限制,表示为a b,即数a必须在数b弹出之前弹出.问有多少种弹出的方案数.n <= 300,m <= 90000 分 ...

  10. PHP -- 模拟测试上传文件

    FROM :http://web.itivy.com/article-740-1.html QQ上传文件为什么那么快? “QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有 ...