scala教程:匿名函数和lambda表达式

匿名函数

如果不关心函数名称,只关心逻辑处理,那么函数名可以省略,没有名字的函数就叫 匿名函数

原函数定义

def main(args: Array[String]): Unit = {
  def add(a:Int,b:Int):Int={
    a+b
  }
  add(1,2)
}

匿名函数定义

2个步骤:

  1. 删除函数名
  2. 将 返回类型 :Int= 改为 =>,否则报错。返回类型自动推断
def main(args: Array[String]): Unit = {
  (a:Int,b:Int) => {
    a+b
  }
}

注意:目前还 不能调用 匿名函数,因为没有函数名

将匿名函数赋给 常量 / 变量

为了 调用 匿名函数,将其 赋给 常量 / 变量

def main(args: Array[String]): Unit = {
  val fun = (a:Int,b:Int) => {
    a+b
  }

  val res = fun(1,2)
  println( res )
}

匿名函数定义- 简化写法

如果函数体中的代码只有一行,那么可省略 {}

def main(args: Array[String]): Unit = {
  val fun = (a:Int,b:Int) => a+b

  val res = fun(1,2)
  println( res )
}

lambda表达式

像上面这种 匿名函数 就是 lambda 表达式

定义

(形参名:类型) => {
  函数体
}

注意:没有返回值类型

例子:定义和调用

为了方便讲解,此处 lambda表达式 只有一个形参

为了调用,将 lambda表达式(匿名函数)赋给一个 变量 或 常量

def main(args: Array[String]): Unit = {
  val f=(s:String)=>{
    println(s)
  }

  f("hello")
}

此时看上去,lambda表达式 与普通函数差不多,只是换了一种写法,其实 lambda表达式 功能非常强大

应用场景

在调用函数时,lambda表达式 可以 作为参数,传给另一个 函数

定义函数,参数是lambda表达式

def main(args: Array[String]): Unit = {

  def test(fun:String => Unit) : Unit={
    fun("测试")
  }

}

解释:

fun:String => Unit

  • 形参名是 fun,
  • :String:表示 lambda表达式的形参类型是 String
  • => Unit:表示 lambda表达式的返回值是 Unit,即:无返回值

注意:

与传统函数的参数不同,传统的参数是数据,如:整型变量、字符串变量

而这里的参数是 lambda表达式

调用函数,传入lambda表达式

注意: 与传统函数的参数不同,传统的传入参数是数据,如:数字1,或者字符串"hello"

而这里传入的参数是 lambda表达式(是处理数据的过程)

def main(args: Array[String]): Unit = {
  //定义函数test,其形参是函数
  def test(fun:String => Unit) : Unit={
    fun("测试")
  }
  //定义lambda表达式
  val f=(s:String)=>{
    println(s)
  }
  //调用
  test(f)

}

调用流程:

简化写法

调用函数时,直接定义lambda表达式,传入函数

def main(args: Array[String]): Unit = {

  def test(fun:String => Unit) : Unit={
    fun("测试")
  }

  test((s:String) => {
    println(s)
  })

}

如下图:


原文出处:/show_1IX1BOKRUYFs.html