muhongdi 2020-04-18
方法(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
scala> def method = println("没有参数的方法") method: Unit scala> val function = () => println("没有参数的函数") // f2: () => Unit = <function0> scala> val function = => println("没有参数的函数") // 编译错误,参数列表可以为空,但不能省略
scala> method 没有参数的方法 scala> function res10: () => Unit = <function0>
// 高阶函数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>