a10_scala 匿名函数 和 匿名函数的简化原则

scala outline

scala outline

为什么使用匿名函数

目标:定义一个计算器,可以实现简单的加减

  1. 定义一个函数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)
    }
  }
  1. 每次使用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)
    }
  }
  1. 以上即使使用了匿名函数,也没见少写多少代码,别急,下面对匿名函数进行简化

匿名函数的简化

简化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条简化原则并不需要同时满足就可以简化

  1. 实现减法
// 只需要在增加一行代码即可
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的永远不能省略圆括号,
但满足了参数只出现一次这条原则)*/
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值