一.常见的几种形式
方法中用函数做参数
def m1(函数名:(参数类型...) => 返回值) : Int = {
}
函数的定义
(形参名:类型...) => 函数体
函数定义常见形式
val f1 = (x:Int,y:Int) => x + y
函数类型的变量
val a:(函数参数类型) =>返回值类型 = 函数名
二.方法和函数的区别
1.函数可作为一个参数传入到方法中,而方法不行,通常情况下方法名可以作为参数,这是因为编译器会自动将方法转换成函数,但是仍然不可以说方法可以作为参数
def m1(f: (Int, Int) => Int): Int = { f(2, 6) } val f1 = (x: Int, y: Int) => x + y def f2(x: Int, y: Int): Int = { x - y } def main(args: Array[String]): Unit = { println(m1(f1)) //正确 println(m1(f2()) //编译错误 println(m1(f2)) //正确 }
2.在Scala中无法直接操作方法(菜鸟上这样写的,不明所以),如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数
val f1 = m _
在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译器需要将方法转换成函数
val f1: (Int) => Int = m
函数类型的变量f1 如果我们直接把一个方法赋值给变量会报错。如果我们指定变量的类型就是函数,编译可以通过
3.函数必须要有参数列表,而方法可以没有参数列表
4.可以把一个函数赋值给变量,但是不可以把一个方法给变量
val f = m _ val f1: (Int) => Int = m val f2 = m //报错