Scala中大括号和小括号的区别

最近遇到一些关于map()和map{}的问题,因此看了看网上的一些博客,自己做个小总结。

像如下
// map方法这样写不能编译通过
scala> List(2).map( case 2 => “OK” )

// 换做花括号就可以了
scala> List(2).map{ case 2 => “OK” }

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

有这么几条原则:

1.当调用的函数有两个及其以上的参数的时候,这时候你只能用小括号。
2.当调用的函数只有一个函数的时候,花括号和小括号都可以使用。但是还有区别的。
3.如果使用小括号,意味着你告诉编译器:它只接受单一的一行,因此,如果你意外地输入2行或更多,编译器就会报错。但对花括号来说则不然,它可以接受多行的输入。foreachRDD和foreachPartition就是例子。
4.在调用一个单一参数的函数的时候,如果参数是用case实现的偏函数,那么你只能使用花括号。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值