在Scala中函数是一等公民,你能够像操做数字同样将函数赋值给一个变量。使用val语句能够定义函数,def语句定义方法:html
class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 }
在Scala中没法直接操做方法,若是要操做方法,必须先将其转换成函数。有两种方法能够将方法转换成函数:app
val f1 = m _
在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也能够显示地告诉编译器须要将方法转换成函数:函数
val f1: (Int) => Int = m
一般状况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。scala
能够直接调用函数上的方法,而方法却不行,例如:code
f.toString //编译经过 m.toString //编译失败
Currying函数能够只传入部分参数返回一个偏函数(partially applied function, 也叫部分应用函数),而Currying方法在转换成偏函数时须要加上显式说明,让编译器完成转换:htm
object TestCurrying { def invoke(f: Int => Int => Int): Int = { f(1)(2) } def multiply(x: Int)(y: Int): Int = x * y def main(args: Array[String]) { invoke(multiply)//编译器会自动将multiply方法转换成函数 val partial1 = multiply(1) //尝试将Currying方法转换成偏函数致使编译失败 val partial2 = multiply(1): (Int => Int) //编译经过 val f = multiply _ //将multiply方法转换成函数f val partial3 = f(1) //只应用第1个参数返回偏函数,编译经过 } }