这期内容当中小编将会给大家带来有关Scala方法和函数的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Scala中既有函数(函数)也有方法(方法),大多数情况下我们都可以不去理会他们之间的区别。但是有时候我们必须要了解他们之间的不同。
Scala中的方法跟Java的方法一样,方法是<强>组成类的一部分>强。方法有名字,类型签的名,有时方法上还有注解,以及方法的功能实现代码(字节码)。
Scala中的函数是一个完整的对象. Scala中用22个<强>特质强>(特征)抽象出了函数的概念。这22特质从Function1到Function22:
如上图中的Function10代表的是:有10个形参,返回值为R(协变)的函数。
函数更常使用的是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称如果你要是用的话,一般会把这个匿名函数赋值给一个变量(其实是val常量),
,表现形式:(传入参数)=祝辞{方法体}
val f =,(名字:字符串)=祝辞println(“嗨,“+名字) ,f (“kafka")
Scala中的函数其实就是继承了这些特征的类的对象,如:我们通过函数字面量定义一个<强>函数强>
,其实上述函数的定义方式跟如下定义方式等同:
由于Function2是特质,不能直接新的。上述,新Function2 (Int, Int, Int)(){},其实是定义并实例化一个实现了Function2特质的类的对象。
是Scala中应用的语法糖:对一个对象obj上调用obj (), Scala编译器会转换为obj.apply();在一个类clazz上调clazz (), Scala编译器会转换为clazz_company_obj.apply(),其中clazz_company_obj为clazz的伴生对象。
<强>具体的差异,总结为如下几点:强>
1。方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以。如:
scala>, def m (x: Int),=2.0 * x m:, (x: Int) Double ,,方法的定义 scala>, val f =, (x: Int)=祝辞,2.0 * x f: Int =祝辞,Double =, & lt; function1>,,函数定义 scala> f res7: Int =祝辞,Double =, & lt; function1>,函数就是 scala>, val tmp =, m _ ,通过这个方式还可以实现方法到函数的变化 tmp: Int =祝辞,Double =, & lt; function1> scala>, m ,直接调用方法名是错误的 时间:13:& lt; console>错误:,missing argument list for method m Unapplied methods 断开连接;only  converted 用functions when a function type is 预期。 你还要make 却;能够conversion explicit by writing “m _”,或“m (_)”, instead of “m”。 ,,,,,, ,,,,,^ 在Scala语言中,函数也是对象,,每一个对象都是scala.FunctionN(22页)的实例,,其中N是函数参数的数量,,例如我们定义一个函数并复制给一个变量: scala>, val f =, (x: Int),=祝辞,x +, 1,(匿名函数的写法) f: Int =祝辞,Int =, & lt; function1> ,这里定义了一个接收一个整型变量作为参数的函数,,函数的功能是返回输入参数加1只可以看到REPL返回参数的toString方法,即,& lt; function0>,只 ,那么如果我们有一个指向函数对象的引用,,我们该如何调用这个函数呢?,答案是通过FunctionN的,apply 方法,,即,FunctionN.apply(),,,因此调用函数对象的方法如下:, scala>, f.apply (3) 它:Int =, 4 但是如果每次调用方法对象都要通过FunctionN.apply (x, y…),就会略显啰嗦,Scala,提供一种模仿函数调用的格式来调用函数对象 scala>, f (3) res3: Int =, 4
在如上的例子中,我们首先定义了一个方法,接着有定义了一个函数f。接着我们把函数名(函数值)当作最终表达式来用,由于f本身就是一个对象(实现了FunctionN特质的对象),所以这种使用方式是完全正确的。但是我们把方法名当成最终表达式来使用的话,就会出错。
<强> 2。方法可以没有参数列表而,函数必须要有参数列表强>
scala>, def m1 =100 m1: Int 没有入参的方法定义,是下面的简写形式 scala>, def m2 (),=100 m2:, () Int 无入参的放到定义 scala>, val f1 =,()=祝辞;100年,,无入参的函数定义 f1:,(),=祝辞,Int =, & lt; function0> scala>, val f1 =,=祝辞,100,,仿照最上面写就直接报的错 & lt; console>: 1:错误:,illegal start of simple 表达式 val f1 =,=祝辞,100Scala方法和函数的区别是什么