scala - 基础:method 和 function的区别

简单解释

方法(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>
posted @ 2020-04-18 06:39  duchaoqun  阅读(231)  评论(0编辑  收藏  举报