函数 和 匿名函数的简化原则"/>
a10_scala 匿名函数 和 匿名函数的简化原则
导航
- scala outline
- 为什么使用匿名函数
- 匿名函数的简化
scala outline
scala outline
为什么使用匿名函数
目标:定义一个计算器,可以实现简单的加减
- 定义一个函数calculator,该函数接收一个函数类型的参数op,op中定义了对2个整数要进行什么操作
定义一个函数calculator,该函数接收一个函数类型的参数op(即函数可以作为参数进行传递)
def main(args: Array[String]): Unit = {println(calculator(10, 20, op))def op(x: Int, y: Int): Int = {x + y}def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int = {op(a, b)}}
- 每次使用calculator时,都需要完全定义一个函数op,好麻烦。简单的做法就是
对op进行变形
,即使用匿名函数
匿名函数:没有名字的函数,通过lambda表达式实现
(参数)=>{函数体}
def main(args: Array[String]): Unit = {println(calculator(10, 20, (x: Int, y: Int) => {x + y}))def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int = {op(a, b)}}
- 以上即使使用了匿名函数,也没见少写多少代码,别急,下面对匿名函数进行简化
匿名函数的简化
简化4原则
(1)参数的类型可以省略,会根据形参进行自动的推导
(2) 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号
(3) 匿名函数体如果只有一行,则大括号也可以省略
(4)如果参数只出现一次,则参数省略且后面参数可以用_代替
承接上述案例实操
- 因为可以根据calculator中的形参自动推导出op的实参类型,所有op的参数类型可以省略
println(calculator(10, 20, (x, y) => {x + y}))
- 匿名函数体如果只有一行,则大括号也可以省略
println(calculator(10, 20, (x, y) => x + y))
- 如果参数只出现一次,则参数可以省略,且后面参数可以用_代替
println(calculator(10, 20, _ + _)) // 只用这一条原则,就可以省略成这样
上述4条简化原则并不需要同时满足
就可以简化
- 实现减法
// 只需要在增加一行代码即可
println(calculator(10, 20, _ - _))
到这里是不是就体现出匿名函数的简单了,这就是为什么使用匿名函数
注意:
类型省略之后,发现()内只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号
// 假设有这样的函数
println(calculator(10, 20, (x) => x))
// 发现只有一个参数,则圆括号可以省略
println(calculator(10, 20, x => x))// 还是上述的函数
println(calculator(10, 20, (x, y) => x + y))
// 圆括号不可以省略 如下形式
println(calculator(10, 20, x, y => x + y))
/*上述之所以可省略成 println(calculator(10, 20, _ + _)),
是因为满足简化原则任何一条就可省略(虽然不满足,类型省略之后,发现()内只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号,
但满足了参数只出现一次这条原则)*/
更多推荐
a10_scala 匿名函数 和 匿名函数的简化原则
发布评论