Scala:函数文本的短格式和占位符语法
创始人
2024-04-19 00:41:15
0

函数文本的短格式

Scala提供了许多方法去除冗余信息并把函数文本写得更简短。注意留意这些机会,因为它们能让你去掉代码里乱七八糟的东西。

51CTO编辑推荐:Scala编程语言专题

一种让函数文本更简短的方式是去除参数类型。因此,前面带过滤器的例子可以写成这样:

  1. scala> someNumbers.filter((x) => x > 0)  
  2. res7: List[Int] = List(5, 10)  
Scala编译器知道x一定是整数,因为它看到你立刻使用了这个函数过滤整数列表(由someNumbers暗示)。这被称为目标类型化:target typing,因为表达式的目标使用——本例中someNumbers.filter()的参数——影响了表达式的类型化——本例中决定了x参数的类型。目标类型化的精确细节并不重要。你可以简单地从编写一个不带参数类型的函数文本开始,并且,如果编译器不能识别,再加上类型。几次之后你就对什么情况编译器能或不能解开谜题有感觉了。

第二种去除无用字符的方式是省略类型是被推断的参数之外的括号。前面例子里,x两边的括号不是必须的:

  1. scala> someNumbers.filter(x => x > 0)  
  2. res8: List[Int] = List(5, 10)  
占位符语法

如果想让函数文本更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数文本内仅出现一次。比如,_ > 0对于检查值是否大于零的函数来说就是非常短的标注:

  1. scala> someNumbers.filter(_ > 0)  
  2. res9: List[Int] = List(5, 10)  
你可以把下划线看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。例如,由于someNumbers在第113页被初始化为值List(-11, -10, -5, 0, 5, 10),filter方法会把_ > 0里的空格首先用-11替换,就如-11 > 0,然后用-10替换,如-10 > 0,然后用-5,如-5 > 0,这样直到List的***一个值。因此,函数文本_ > 0与稍微冗长一点儿的x => x > 0相同,演示如下:

  1. scala> someNumbers.filter(x => x > 0)  
  2. res10: List[Int] = List(5, 10)  
有时你把下划线当作参数的占位符时,编译器有可能没有足够的信息推断缺失的参数类型。例如,假设你只是写_ + _:

  1. scala> val f = _ + _  
  2. < console>:4: error: missing parameter type for expanded  
  3. function ((x$1, x$2) => x$1.$plus(x$2))  
  4.  val f = _ + _  
  5.  ˆ  
这种情况下,你可以使用冒号指定类型,如下:

  1. scala> val f = (_: Int) + (_: Int)  
  2. f: (Int, Int) => Int = < function>  
  3. scala> f(5, 10)  
  4. res11: Int = 15 

请注意_ + _将扩展成带两个参数的函数文本。这也是仅当每个参数在函数文本中最多出现一次的情况下你才能使用这种短格式的原因。多个下划线指代多个参数,而不是单个参数的重复使用。***个下划线代表***个参数,第二个下划线代表第二个,第三个……,如此类推。

【相关阅读】

  1. 介绍Scala的***类函数
  2. Scala的本地函数:将私有方法转换为本地方法
  3. Scala中定义函数的方法:method
  4. 继续领悟函数式:Scala指令式风格代码的重构
  5. 学习Scala的变量范围

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...