Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
Scala 中的方法跟 Java 的类似,方法是组成类的一部分。
Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
Scala 中使用 val 语句可以定义函数,def 语句定义方法。

3.1 方法

3.1.1 方法的声明

Scala 方法声明格式如下:
def 方法名([参数列表]) : [返回值类型]={
// 方法主体代码
[return 表达式]
}

  • 方法定义由一个 def 关键字开始,紧接着是可选的参数列表,一个冒号 : 和方法的返回类型,一个等于号 = ,最后是方法的主体。
  • 参数列表中的参数可以使用逗号分隔。
  • 返回值类型 可以是任意合法的 Scala 数据类型,无返回值为Unit(相当于Java的void)。
  • 如果你不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它的类型于是也是一个抽象类型。

【例】
image.png

3.1.2 方法的调用

3.1.2.1 一般调用

以下是调用方法的标准格式:
方法名( 参数列表 )
参数列表(实际参数)与调用方法的参数(形式参数)遵循三一致原则:参数个数一样,顺序一样,类型一样。
【例】
image.png
输出结果:
image.png

3.1.2.2 指定参数名调用

一般情况下函数调用参数,就按照函数定义时的参数顺序一个个传递。但是我们也可以通过指定函数参数名,并且不需要按照顺序向函数传递参。
【例】
image.png

3.1.3 默认参数值

Scala 可以为函数参数指定默认参数值,使用了默认参数,你在调用函数的过程中可以不需要传递参数,这时函数就会调用它的默认参数值,如果传递了参数,则传递值会取代默认值。实例如下:
【例】
image.png
输出结果:
image.png

3.1.4 可变参数

Scala 允许你指明函数的最后一个参数可以是重复的,即我们不需要指定函数参数的个数,可以向函数传入可变长度参数列表。通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。
【例】
image.png
输出结果:
image.png

3.1.5 递归函数

递归函数在函数式编程的语言中起着重要的作用,递归函数意味着函数可以调用它本身。
递归函数满足两个条件:

  • 递归结束条件
  • 递归表达式

【例 1】求n!
5!=54321
4!=4321
3!=3
21
2!=2
1
1!=1
(1)递归结束条件:1!=1,如果n=1,返回值为1。
(2)递归表达式:5!=54!,即n!=n(n-1)!。
image.png
输出结果:
image.png
【例 2】求下列数列前20项之和。
已知数列:1,1,2,3,5,8,13,21,……
(1)递归结束条件:第一项,第二项为1,如果i=1或i=2,返回值为1。
(2)递归表达式:从第三项开始,第i项=(第i-1项)+(第i-2项),即f(i)=f(i-1)+f(i-2)。
image.png

3.1.6 匿名函数

Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。使用匿名函数后,我们的代码变得更简洁了。
【例】
image.png

3.1.7 偏应用函数

Scala 偏应用函数是一种表达式,你不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。
如,以下三次调用out(x,y)函数:
out(100,1);
out(100,2);
out(100,3);
以上程序执行时调用了三次add,参数 x值都相同,y不同。我们可以使用偏应用函数优化以上方法,绑定第一个 x参数,第二个参数使用下划线(_)替换缺失的参数列表,并把这个新的函数值的索引的赋给变量。
image.png
输出结果:
image.png

3.1.8 函数柯里化

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
【例】
image.png

3.1.9 简化函数定义

当函数参数只在函数体中出现一次,而且函数体没有嵌套调用时,可以使用下划线来简化函数定义。
【例1】
image.png
输出结果:51

3.2 函数

Scala 有方法与函数,二者在语义上的区别很小。
【例】
image.png
输出结果:
image.png