scala map 小括号与大括号

原文地址:http://hongjiang.info/scala-pitfalls-2/

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

阅读更多
个人分类: spark
想对作者说点什么? 我来说一句

微信小程序系统教程[初级阶段]

微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[高级阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[高级阶段]全套课程”包含: 1.微信小程序系统教程[高级阶段]_客服消息 2.微信小程序系统教程[高级阶段]_微信支付 3.微信小程序系统教程[高级阶段]_九宝电商系统 学习“微信小程序系统教程[高级阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[高级阶段]”。 高级阶段讲解的客服消息,是针对小程序的。后台程序用最接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

学院

2017年02月13日 08:34

没有更多推荐了,返回首页

不良信息举报

scala map 小括号与大括号

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭