匿名函数
如果不关心函数名称,只关心逻辑处理,那么函数名可以省略,没有名字的函数就叫 匿名函数
原函数定义
def main(args: Array[String]): Unit = {
def add(a:Int,b:Int):Int={
a+b
}
add(1,2)
}
匿名函数定义
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)
})
}
如下图:

