Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有一点特别的:这些操作符实际上是方法。

例如:

1
2
3
4
a + b
是如下方法调用的简写:
a.+(b)
a 方法 b可以写成 a.方法(b)

定义方法

image

image

方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型。

image

定义函数

image

方法和函数的区别

在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作,函数是一个对象,继承自FuctionN。N代表函数创建是有多少个参数。

函数对象有apply、curried(柯里化)、toString、tupled(元组)这些方法。而方法不具有这些特性。

如果想把方法转换成一个函数,可以用方法名跟上下划线的方式。

案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面
image

方法代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
object FunctionApp {
def main(args: Array[String]): Unit = {
sayHello("小明")

println(add(1, 2))

defaultValue(null)

variableParameter(1, 2, 3, 4, 5)
}

/**
* 无返回值
*
* @param name
*/
def sayHello(name: String): Unit = {
println("Hello " + name)
}

/**
* 最后一个执行的结果就是返回值,不需要return
*
* @param x 参数一
* @param y 参数二
* @return 相加结果
*/
def add(x: Int, y: Int): Int = {
x + y
}

/**
* 默认参数
*
* @param name 参数,有一个默认值
*/
def defaultValue(name: String = "李四"): Unit = {
println("你好 " + name)
}

/**
* 可变参数函数
*
* @param num 可变参数(类型必须相同)
*/
def variableParameter(num: Int*) {
var count: Int = 0
num.foreach(e => {
count += e
})

println("总和:" + count)
}
}