Scala匿名函数详解

语法:

Expr ::= (Bindings | Id | "_‟) "=>‟ Expr

ResultExpr ::= (Bindings | (Id | "_‟) ":‟ CompoundType) "=>‟ Block

Bindings ::= "(‟ Binding {",‟ Binding} ")‟

Binding ::= (id | "_‟) [":‟ Type]

匿名函数(x1: T1,...,xn: Tn) => e 将类型为Ti的参数xi映射为由表达式e给出的结果。每个正式参数xi的作用域是e。正式参数必须具有两两不同的名称。

如果匿名函数的期望类型具有scala.Functionn[S1,...,Sn, R]的形式,则e的期望类型是R,每个参数xi的类型Ti可忽略,可假定Ti = Si。如果匿名函数的期望类型是某些其他类型,则所有正式参数的类型都必须显式的给出,且e的期望类型是未定义的。匿名函数的类型是scala.Functionn[S1,...,Sn, T],这里T是e的打包类型(§6.1)。T必须等价于一个不引用任何正式参数xi的类型。

匿名函数求值方式为实例创建表达式

new scala.Functionn[T1,...,Tn, T] {

def apply(x1: T1,...,xn: Tn): T = e

}

在具有单个未类型化的正式参数时,(x) => e可缩写为 x => e。如果匿名函数 (x: T) => e有单个类型化的参数作为一个代码块的结果表达式出现,则可缩写为x: T => e。

一个正式参数也可以是由一个下划线 _ 表示的通配符。在此情况下可以随意选择该参数的一个新名称。

示例6.23.1 匿名函数的例子

x => x //恒等函数

f => g => x => f(g(x)) //柯里化的函数组合

(x: Int, y: Int) => x + y //求和函数

() => { count +=1; count } //该函数参数列表为空

//将一个非本地变量‟count‟加1

//并返回新的值

语句

68

_ => 5 //该函数忽略其所有参数并总是返回5

匿名函数的占位符语法

语法:

SimpleExpr1 ::= "_‟

一个表达式(语法上归类为Expr)可以在合法的标识符处包含内嵌的下划线记号 _。这样一个表达式表示一个下划线后的位置的连续的参数的匿名函数。

定义下划线段具有形式为_:T的表达式,T是一个类型,或者形式为_,下划线并不是类型归属_:T的表达式部分。

具有Expr句法归类的表达式e绑定到下划线段u的两个条件是:(1) e合理包含u,且(2)没有其他的具有Expr句法归类的表达式合理包含于e且其自身合理包含u。

如果表达式e按照既定顺序绑定到下划线段u1,...,un,则等价于匿名函数(u‟1,...,u‟n)=> e‟,每个u‟i是将ui中下划线替换为新的标识符的结果,e‟则是将e中每个下划线段ui替换为u‟i的结果。

示例6.23.2 左侧的匿名函数使用了占位符语法。每个都等价于其右侧的匿名函数

_ + 1 x => x + 1

_ * _ (x1, x2) => x1 * x2

(_: Int) *2 (x: Int) => (x: Int) * 2

if (_) x else y z => if (z) x else y

_.map(f) x => x.map(f)

_.map(_ + 1) x => x.map(y => y + 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值