简单解释
方法(method)
在OOP中,方法作用于对象,是对象的行为,Java中的方法这样的,在Scala中的方法(method)也是如此,定义method的基本格式:
def 方法名称(参数列表):返回值 = 方法体
函数(function)
在scala中,函数被看做是一等公民,定义函数基本格式:
val f1 = (x: Int) => println(x) //打印
val f2 = (x1: Int) => x1 + 4 //将原数据+4
一些例子
scala> def add3(x:Int) = x + 3
add3: (x: Int)Int // 表示Method add3有一个参数Int型参数x,返回值是Int型.
scala> add3(3)
res0: Int = 6
scala> val f1 = (x:Int) => x + 3
f1: Int => Int = <function1> // 表示Function f1的method体接受一个Int型的参数,输出结果的类型是Int型。f1的类型是function1
scala> f1(3)
res1: Int = 6
区别
- 参数列表对method是可选的,对function是必须的(function参数列表可以为空)
scala> def method = println("没有参数的方法")
method: Unit
scala> val function = () => println("没有参数的函数") // f2: () => Unit = <function0>
scala> val function = => println("没有参数的函数") // 编译错误,参数列表可以为空,但不能省略
- Method名意味着Method调用,Function名只是代表Function自身
scala> method
没有参数的方法
scala> function
res10: () => Unit = <function0>
- 在需要function的地方可以提供一个method(它会自动转换成function,该行为被称为ETA expansion)
// 高阶函数foreach接收的是一个函数,但也可以传入一个方法,scala会将这个方法自动转义成函数。
// foreach是List对象的一个高阶函数,它接收一个函数,并应用于List中的每一个元素,而method是一个方法。
def method(x: Any) = println(x)
val list = List[String]("Scala", "Spark", "Java")
list.foreach(method(_))
注意:
期望出现Function的地方,我们可以使用Method。
不期望出现Function的地方,Method并不会自动转换成Function。
在scala中操作符被解释成方法:
前缀操作符:op obj 被解释称obj.op
中缀操作符:obj1 op obj2被解释称obj1.op(obj2)
后缀操作符:obj op被解释称obj.op
可以在Method名后面加一个下划线强制变成Function。 注意: Method名与下划线之间至少有一个空格!!
scala> def method1(x:Int) = { x + 84 }
method1: (x: Int)Int
scala> val function1 = method1 _
function1: Int => Int = <function1>
scala> function1(3)
res5: Int = 87
scala>