匿名函数
没有名字的函数就是匿名函数。 (x:Int)=>{函数体}
x:表示输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑。
object fun {
def main(args: Array[String]): Unit = {
val fun = (name:String) => {println(name)}
//定义一个函数,以函数作为参数输入
def f(func: String => Unit): Unit = {
func("直接输出")
}
f(fun)
f((name : String) => {println("匿名函数主体"+name)})
}
}
匿名函数的致简原则
object fun {
def main(args: Array[String]): Unit = {
def f(func: String => Unit): Unit = {
func("直接输出")
}
// (1)参数的类型可以省略,会根据形参进行自动的推导
f((name) => {println(name)})
// (2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过 1 的永远不能省略圆括号。
f(name => {println(name)})
// (3)匿名函数如果只有一行,则大括号也可以省略
f((name) => println(name))
// (4)如果参数只出现一次,则参数省略且后面参数可以用_代替
f( println(_))
//(5)如果可以推断出当前传入的println是一个函数体,而不是调用语句可以直接省略下划线
f( println) //省略得只剩裤衩了
}
}
匿名函数案例
object fun {
def main(args: Array[String]): Unit = {
//案例
//定义一个“二元运算函数” 只操作1和2两个数,具体运算通过参数传入
def oneAandTwo(fun:(Int,Int) => Int): Int ={
fun(1,2)
}
val sun = (a:Int,b:Int) => a+b
val minus = (a : Int,b : Int) => a - b
//传入函数打印求和
println(oneAandTwo(sun))
//传入函数打印相减
println(oneAandTwo(minus))
//匿名函数简化
println(oneAandTwo((a : Int, b : Int) => a+b))
//下划线代替 “省略到没有裤衩” 照样能运行
println(oneAandTwo(_+_))
}
}
高阶函数的用法
函数可以作为值进行传递
object fun {
def main(args: Array[String]): Unit = {
def fun(a : Int): Int={
println("调用")
a+1
}
//函数作为值传递
//在被调用函数 fun 后面加上 _,相当于把函数 foo 当成一个整体,传递给变量 f1
val f2 = fun _
//)如果明确变量类型,那么不使用下划线也可以将函数作为整体传递给变量
val f1 : Int => Int = fun _
println(f1(1))
println(f2(2))
}
}
函数可以作为参数进行传递
object fun {
def main(args: Array[String]): Unit = {
//定义一个计算函数
def dualEval(op : (Int,Int) => Int, a : Int,b : Int):Int = { //其中op : (Int,Int) => Int, a : Int,b : Int为传入的函数参数
op(a,b)
}
def sum(a : Int,b : Int): Int ={
a+b
}
//把函数作为参数传递
println(dualEval(sum, 1, 2))
}
函数可以作为函数返回值返回
object fun {
def main(args: Array[String]): Unit = {
def f1(): Int => Unit = {
def f2(a : Int): Unit = {
println("调用f2 "+a)
}
//f2函数作为返回值返回
f2
}
//调用f2
println(f1()(10))
}
}