Scala匿名函数中下划线简化的注意事项
基本使用与原理
在使用匿名函数的时候,如果参数在函数体中只出现溢出,则参数可以省略,并且后面的参数可以使用下划线_
开代替,并且下划线必须按照顺序进行接收,使用下划线的时候必须省略参数列表和箭头=>
。
在Scala中,下划线简化函数扩展为原本函数的过程称为eta-expansion,并且其中存在就近扩展原则:下划线_
组成的表达式遇到括号()
,或者抵达了最顶层则会发生函数的扩展。这里需要注意,单个的下划线并不算是下划线表达式。
eta-expansion:将简化函数扩展为匿名函数,举例来说,
_+1
扩展为x=>{x+1}
注意细节
1.多个括号嵌套不用下划线简写
由于下划线表达式遇到括号会发生函数扩展,因此在存在多个括号嵌套的时候可能会发生函数扩展导致的报错。下面举两个常见的错误例子
1 |
|
1 |
|
2.代码块的返回值和匿名函数混淆
在使用下划线的场景中,我们最终得到的会是很简化的表达,但是这个简化表达往往可能会误导我们,尤其是容易将代码块的返回值和匿名函数混淆。
例如下面的代码:
1 |
|
我们容易将整个{}
代码块中的内容都看作是传入map中的匿名函数的内容。但是实际上,传入map中的参数是一个代码块,而这个代码块的返回值是一个下划线表达式,这个下划线表达式可以扩展为一个匿名函数,因此最终传入map中的函数应该为x=>{x + 1}
,在获得代码块的返回值的过程中,会执行依次println("-map-")
,后面都不会执行了,因此上面代码的输出为
1 |
|
如果要实现每个元素操作的时候都输出一次-map-
,则还是需要使用没有简化的匿名函数
1 |
|
输出结果为
1 |
|
Scala匿名函数中下划线简化的注意事项
http://example.com/2022/05/10/Scala匿名函数中下划线简化的注意事项/