当我们定义一个函数字面量时,实际上定义了一个包含apply方法的Scala对象。Scala对这个方法名有特别的规则,一个有apply方法的对象可以把它当成方法一样调用。我们定义一个函数字面量(a, b) => a < b
,它其实是一段创建函数对象的语法糖:
val lessThan = new Function2[Int, Int, Boolean] {
def apply(a: Int, b: Int) = a < b
}
lessThan的类型是Function2[Int, Int, Boolean], 通常写成(Int, Int) => Boolean。注意Function2接口(在Scala中是trait)包含一个apply方法,当我们以lessThan(10, 20)的方法调用函数lessThan时它实际是对apply方法调用的语法糖:
val b = lessThan.apply(10, 20)
Function2只是一个由Scala标准库提供的普通的特质(接口), 代表接收两个参数的函数对象。同样在标准库里还提供了Function1、Function3等其他函数对象,接收的参数个数从名称里能看出来。因为这些函数在Scala中就是普通函数,所以它们也是一等值。