我正在尝试理解这两种引用/定义Function Literal
(引用anonymous function
)方法之间的重要区别:
按val
scala> val v2 = new Function[Int, Int] {
| def apply(a: Int): Int = a + 1
| }
v2: Int => Int = <function1>
并def
scala> def f2 = new Function[Int, Int] {
| def apply(a: Int): Int = a + 1
| }
f2: Int => Int
在使用方面似乎几乎相同。我可以将v2
或f2
传递给接受(Int) => Int
作为参数的函数。将参数传递给它..
我想或者v2的情况是它创建了一个引用Function1
对象的Function1
对象..就像proxy
一样?
好的..我的问题是:第1和第2种方法的优点和缺点是什么?
它由def
定义,是否仍为Function Literal
?
答案 0 :(得分:3)
首先,你的两个例子都不是函数文字 - 你是用普通的无糖方式创建一个Function
实例,事实上你可以用它方法(new Function { ... }
)从Java代码创建scala.Function
的实例。
以下是两个函数文字,并且与您的定义完全等效:
val v2 = (a: Int) => a + 1
def f2 = (a: Int) => a + 1
唯一真正的区别在于val
将一劳永逸地创建一个实例,无论您使用v2
多少次(即使您从未使用过它), def
每次都会创建一个新实例(如果你从未使用它,则根本不创建)。因此,您通常希望使用val
。
但是,有些情况下您需要使用def
。请考虑以下事项:
def myIdentity[A] = (a: A) => a
我们无法将其写为val
,因为Scala在这个意义上没有多态函数(对于Function[A, B]
,A
和{{1}的任何实例必须是具体的类型)。但是我们可以定义一个返回函数的多态方法,当我们写例如B
,myIndentity(1)
将被推断为A
,我们将完全按照您的预期创建(并应用)Int
。