例如
val f1 = (a:Int) => a+1
def f2 = (a:Int) => a+1
似乎它们是可以互换的,是否有任何特定的用例我应该使用特定的用例?
通常将def
版本写为:
def f2(a:Int) = a+1
如果你按照他们的方式编写它,它实际上是在创建一个方法f2
,当被调用时,它会构造一个新的函数闭包。所以在你的两种情况下,你仍然有一个功能。但是在第一种情况下,该函数只被构造一次并存储(作为f1
)以供以后使用。但是在第二种情况下,每次f2
引用都会构造函数,这有点浪费。
那么什么时候更喜欢函数而不是方法呢?好吧,在某些情况下,您可以更轻松地使用函数。考虑这种情况:
(1 to 3).map(f1 andThen f1) // totally fine
(1 to 3).map(f2 andThen f1) // "missing arguments" error
(1 to 3).map(f2 _ andThen f1) // fixed by adding "_" after the method name
所以f1
总是一个函数,所以你可以调用一个类似的方法andThen
。变量f2
代表一个方法,所以不希望这样使用;它总是期望后面跟着参数。您总是可以通过在方法后面加上下划线将其转换为函数,但如果没有必要,这可能看起来有点难看。