什么是Lambda表达式
由于在scala中,函数是frist-class,函数可以像`数据类型`一样,定义变量并为变量赋值
此时的这个函数字面量就称之为 Lambda表达式
一、声明 Lambda表达式
功能:
指定 函数的参数个数、参数数据类型、返回值数据类型
标准格式:
(参数1_数据类型,参数2_数据类型...) => 返回值数据类型
省略格式:
当只有一个参数时,可以省略 ()
数据类型 => 返回值数据类型
二、为 Lambda表达式 赋值
功能:
指定 函数的具体逻辑
方式1(使用已定义函数):
函数名称 _ | 函数名称(可以自动类型推断的时候可以省略_)
方式2(使用函数字面量):
标准格式:
(参数1:数据类型,参数2:数据类型...) => {函数体}
省略格式:
省略参数的数据类型
使用条件: 可以根据 显式的声明 做自动类型推断时
(参数1,参数2...) => {函数体}
省略 ()
使用条件: 只有一个参数时,且省略了数据类型
参数1 => {函数体}
省略 {}
使用条件: 函数体只有一行时
省略 (参数1,参数2...) =>
使用条件: 所有参数只在函数体内使用1次, 参数名称 用 _ 来代替
三、代码示例
object Lambda extends App {
// 为自由变量赋值
val sum: Int => Int = (x: Int) => x + 100
val sum1: Int => Int = (x) => x + 100 // 省略数据类型
val sum2: Int => Int = x => x + 100 // 省略数据类型 + ()
val sum3: Int => Int = _ + 100 // 省略数据类型 + () + 参数名称 =>
val sum4 = (x: Int) => x + 100 // 变量没有显式的声明数据类型,所以不能使用 省略格式
/*
* 思考: 为什么可以省略呢?
* 因为我们显示的声明了 Lambda的数据类型,编译器可以根据声明的数据类型做自动推断
*
* */
val sum5: (Int,Int,Int) => Int = _ + _ + _
// 为函数的参数变量赋值(绑定变量)
def add(x: Int, sum: Int => Int): Int = {
sum(x) + 100
}
def subAdd(x:Int) = x + 100
add(100,subAdd) // 使用已经定义函数 赋值
add(100,subAdd _)
add(100, (x: Int) => x + 100) // 标准格式
add(100, (x) => x + 100) // 省略数据类型
add(100, _ + 100) // 省略 (x) =>
}