Eta 扩展在高层次上,是将方法转换为函数的过程。为什么?什么?他们不一样吗?让我们解释一下:
Scala 中的一个方法就是我们所知道的def someMethodName(SomePramList): SomeReturnType
. 它以def
. 它可能有参数列表,甚至可能超过 1 个。例如:
def numAdder(num1: Int)(num2: Int): Int =
num1 + num2
一个function或lambda
function 看起来像:(SomeParams) => SomeReturnType
. 例如:
val aFunction: Int => Int => Int = (num1: Int) => (num2: Int) => num1 + num2
了解函数的重要一点是,这种语法基本上是FunctionN.apply
方法的语法糖。
需要eta扩容的场景有哪些?
一些例子:
示例 1 - 在内部map
(或filter
等flatMap
)应用方法
编写这样的代码:
def addPlus1(x: Int): Int = x + 1
List(1,2,3).map(addPlus1)
编译器需要在map
. 因此,它将给定的方法转换为函数:
List(1,2,3).map(x => addPlus1(x))
. 这是Eta expansion
.
示例 2 - 柯里化
定义柯里化方法时,例如:
def numAdder(num1: Int)(num2: Int): Int =
num1 + num2
他们创建了一个函数,例如:
val curriedFunction: Int => Int = numAdder(4)
//or
val curriedFunction2 = numAdder(4) _
我们从方法中定义了一个函数。这是Eta expansion
.
更多示例
定义了一个接受函数值的方法:
def someMethod(f: () => Int): Int = f()
def method(): Int = 10
然后运行:
someMethod(method)
将方法method
转换为函数。这是Eta expansion