<< ..
Scala中的{} () 以及偏函数
发布时间:初学scala,觉得()
和 {}
分的不是太清楚,从for语句的用法看来,可以实现同样的东西,如果用println
就更觉得是一个东西。
for(item <- items)
for{
item <- items
}
scala> println("Hello")
Hello
scala> println{"Hello"}
Hello
以HongJiang.info的例子讨论学习:
scala> List(2).map( case 2 => "digg" )
<console>:1: error: illegal start of simple expression
List(2).map( case 2 => "digg" )
^
scala> List(2).map{ case 2 => "digg" }
res11: List[String] = List(digg)
我们构建了List(2)
,将里面的元素用map()
映射到后面的pattern match
里,使用()
报错了,使用{}
返回了正确的结果。为什么会这样,需要引出偏函数(又称”部分函数”)的概念。
所谓偏函数(也叫部分函数)与完全函数对应,普通的方法都是完全函数,即 f(i:Int) = xxx
是将所有Int类型作为参数的,是对整个Int集的映射;而偏函数则是对部分数据的映射,比如上面{case 2=> "OK" }
就仅仅只对2做了映射。偏函数的实现都是通过模式匹配来表达的。
构建一个偏函数p
,并map到它:
scala> val p:PartialFunction[Int,String] = { case 2 => "OK" }
p: PartialFunction[Int,String] = <function1>
scala> List(2) map p
res21: List[String] = List(OK)
因为偏函数是通过 { case x => y }
这种特殊的方式来描述的,上面的{case 2=>"OK"}
就被当作了一段偏函数字面量,而偏函数背后的类型PartialFunction[A,B]
是继承自Function1[A,B]
的,所以将这段匿名的偏函数传给map方法是ok的。
偏函数到底是什么
偏函数是只对函数定义域的一个子集进行定义的函数,定义域X中可能存在某些值在值域Y中没有对应的值。scala中用scala.PartialFunction[-T, +S]类来表示。比如前文中这个例子就是定义了一个偏函数:
scala> val p:PartialFunction[Int,String] = { case 2 => "OK" }
p: PartialFunction[Int,String] = <function1>
当你在代码中需要多次调用一个函数, 而其中的某个参数又总是一样的时候, 使用这个可以使你少敲一些代码。
所以回头看,如果想搞懂偏函数,必须先搞懂scala中的模式匹配,因为scala可以通过模式匹配来定义偏函数,多半也是用在模式匹配里了。