Scala 定义函数标准



以下内容是等效的:

scala> val f1 = {i: Int => i == 1}
f1: Int => Boolean = <function1>
scala> val f2 = (i: Int) => i == 1
f2: Int => Boolean = <function1>

我更熟悉前者(来自Groovy),但后一种形式更为常见,AFAIK,这是在Scala中定义函数的标准方法。

我应该忘记过去(Groovy)并采用第二种形式吗?第一种形式对我来说更自然,因为它看起来类似于Groovy/Ruby/Javascript定义闭包(函数)的方式

编辑
请参阅Zeiger在此线程中的回答,例如,groovy/ruby/javascript闭包{=>}语法似乎比() =>更自然,我认为两者都可以互换使用,具有相同的性能,传递能力等,唯一的区别是语法

我认为

这是品味问题(scala风格指南推荐第一个)。前者允许您编写多行(正文中>2行)函数:

val f1 = { i: Int =>
  val j = i/2
  j == 1
}

有时它很有用

实际上,这两个版本都是"完整"版本的简化形式。

完整版:多个参数,多个语句。

scala> val f0 = { (x: Int, y: Int) => val rest = x % y; x / y + (if (rest > 0) 1 else 0) }
f0: (Int, Int) => Int = <function2>

"时髦"版本:一个参数,多个语句。

scala> val f1 = { x: Int => val square = x * x; square + x }
f1: Int => Int = <function1>

"scala"版本:多个参数,一个语句。

scala> val f2 = (x: Int, y: Int) => x * y
f2: (Int, Int) => Int = <function2>

具有单个参数和单个语句的版本不存在,因为它在语法上无效(即,语法不太有效)。

最新更新