函数式编程——在scala中使用extends Function2[Int, Int]定义对象的用例是什么?



下面的对象sum与函数f(i: Int, j:Int) = i + j有什么不同

据我所知,函数是trait,每次我们声明一个函数时,都会创建一个带有相应定义的apply方法的trait对象。但是我不能理解像下面这样的对象定义有什么特殊的目的。

如果我错了,请纠正我。

 object sum extends Function2[Int, Int, Int]{
    def apply(first: Int, second: Int) = {
      first + second
    }
  }

这是一个值;f不是,它可以被转换成一个值,如果它在几个地方使用,它将被转换多次,这可能对性能有一个(可能非常小)的影响。然而,我不认为与val sum = (i: Int, j: Int) => i + j相比有任何优势(或者如果需要在顶层,object A { val sum = (i: Int, j: Int) => i + j })。

方法有几个函数字面量没有的特性:

  • 方法可以是泛型的,而函数字面值不能,
  • 方法可以有隐式参数列表,而函数字面量不能,
  • 方法可以有带有默认参数的可选参数,而函数字面量不能,
  • 方法可以有重复的参数,而函数字面值不能。
因此,通过显式定义apply方法而不是使用函数字面语法糖,您可以访问所有这些。

还可以添加其他方法和/或字段。

但是,您的示例没有使用这些,所以实际上,使用显式语法没有意义。

实际上,有一个区别:在

val sum = (first: Int, second: Int) => first + second

sumval,而在您的示例中,它是object

还请注意,您发布的代码:

def f(i: Int, j:Int) = i + j

不是一个函数,它是一个方法!我的答案适用于函数文字和显式定义的FunctionN实例/子类型之间的区别,而不是方法。

最新更新