spark编程的时候的时候看到这样的一个用法:

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

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

// 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}会被当作偏函数字面量。

2021-03-15 scala map 小括号与大括号相关推荐

  1. Scala之小括号和花括号(Parentheses Crurly Braces)

    文章目录 在调用函数时 如果你要调用的函数有两个或两个以上的参数,那么你只能使用"小括号" 如果你要调用的函数只有单一参数,那么"通常"情况下小括号和花括号是可 ...

  2. shell中的小括号与大括号

    小括号与大括号中变量的区别: 小括号中的变量命令会在子shell中运行,所以运行后的值不会影响主shell中变量:大括号不会重启一个子shell. 转载于:https://www.cnblogs.co ...

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

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

  4. shell中的括号(小括号,大括号/花括号)的使用方法

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

  5. linux中shell的小括号、大括号的用法区别

    Linux中小括号()和大括号{}都是对其中的一串命令进行执行,但有一定的区别,其区别如下: 1 小括号() ①命令组.括号中的命令新开一个子shell程序,括号中的变量为本地变量 ,不能够在脚本其他 ...

  6. 2021.03.15 云题库

  7. 2021.10.15数字货币小计

    今天大盘收btc期货可能通过的消息,btc冲向60000点,现在收涨4.27个点,收在59775点,今天shibswap在发布nft之后,shib就开始泄水,现在收跌7.46个点,leash更是夸张, ...

  8. E.03.15 Closing of Beloved Dim Sum Hall Leaves a ‘Crater‘ in Reeling Chinatown

    2021.03.15 文章目录 [课程导读] [英文原文] [外刊原文] [课程导读] 只要有唐人街的地方,就一定会有茶餐厅.精致好味的广式料理在海外,已然变成中餐的代名词.然而,一场疫情令全球餐饮业 ...

  9. 小括号在c语言的作用,C语言的小括号----其实是逗号运算符

    比如下面的代码: #include void fun() { int a, b, c, d; a = (, b = ); c = (, ); d = (, ); printf("%d %d ...

最新文章

  1. 如何读取比机器内存大的文件(内存4G,文件 8G,读取大文件) ?
  2. 使用元学习和推理改善您的模型!
  3. Linux常用命令——tar
  4. PIC单片机精通_ADC左对齐与右对齐的数据读取问题
  5. Linux 下如何查询 tomcat 的安装目录
  6. linux z是什么文件夹,Linux znew初学者命令实例教程
  7. 02_Spring Cloud Alibaba整合通用Mapper+Lombok+Mysql
  8. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例
  9. IEEE 1588-2002 Precision Time Protocol(PTP)
  10. 旅游新时尚:点点鼠标就可“周游世界”
  11. 密码生成器--python
  12. java12 - 7 排序的案例
  13. 五人表决器课程设计单片机c语言,基于单片机的五人表决器的设计.doc
  14. Clark变换及比例系数2/3推导过程
  15. 数字PCR的数学原理及系统间相互比较
  16. Hibernate类的继承使用joined-class实现
  17. 从0到1,构建商业分析模型
  18. 读书笔记:《我们身在何方?》
  19. 快递鸟电⼦⾯单批量打印流程与注意事项
  20. 区块链在信用借贷中的应用

热门文章

  1. 2021全新出发!最新笔记汇总,量变导致质变,坚持记录!
  2. 用python显示出所有能被17整除的三位数_小学弟敲了一个晚上整理的Python初学者习题,给你们学习!...
  3. Live800:在线客服系统哪家强?
  4. 小程序swiper修改指示点样式
  5. 2048小游戏html制作,[ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)
  6. java中三种可能导致异常的情况_JAVA基础知识点之异常
  7. 从单片机初学者迈向单片机工程师第二版第一章 究竟该如何学习
  8. php eclipse 远程断点,使用PHP 版eclipse来配置远程DEBUG PHP代码
  9. 从产品视角分析拼多多
  10. 场地测量的方法和程序_简述水准测量的操作程序和方法步骤