语法格式:
def 方法名(参数名:参数类型, 参数名:参数类型...):[return type] = {
方法体 // 如果方法体只有一行代码,那么外面的大括号{}可以省略
}
一般情况下返回值的类型是可以省略不写让scala自己去判断的,
但是如果该方法是一个递归的方法,就必须要写返回值类型[return type]
示例1:求两个数的最大值
def getMax(a:Int, b:Int) = {
return if(a >= b) a else b
}
val max = getMax(2, 5)
上面的方法简写
def getMax(a:Int, b:Int) = return if(a >= b) a else b
示例2:求n的阶乘
我们先试一下不写返回值类型的情况
def factorial(n:Int) = {
return if(n == 1) 1 else n*factorial(n-1)
}
执行报错: error: method factorial has return statement; needs result type
修改一下
def factorial(n:Int):Int = {
return if(n == 1) 1 else n*factorial(n-1)
}
val sum = factorial(5) // sum = 120
当我们定义了一个有返回值的方法,接收返回值的变量被声明为lazy时,该方法不会被执行,直到变量首次被使用。
示例:
def getSum(a:Int, b:Int) = a + b
lazy val sum = getSum(2, 3) // 此时方法不会被执行
print(sum) // 在这里方法开始执行
scala方法的参数主要分为三种类型
方法中带有默认值的参数,这类参数我们在调用方法时可以不用传值,它会使用默认值进行赋值
示例:
def getSum(a:Int = 2, b:Int = 3) = a + b
val sum = getSum() // 不需要传值
print(sum)
我们在调用方法的时候,不指定参数名时默认按照参数的位置进行赋值,但是我们也可以通过指定参数名来进行赋值,必须要按照顺序
示例:
def getNumber(a:Int, b:Int) = {
println(s"a=${a}\nb=${b}")
}
getNumber(b = 1, a = 2)
有时候在定义方法时,可能无法确定方法的参数个数,这时可以用不定长参数。它会将接收的参数组合成数组。
示例:
def getSum(numbers:Int*) = {
print(numbers)
numbers.sum // 求和
}
val sum = getSum(1,2,3,4,5,6,7)
print(sum)
“对象.方法()”的方式,是常用的调用方式
示例:
// abs是Math中求绝对值的方法
val a = Math.abs(-10)
print(a)
“对象 方法 参数”的方式,在scala中比较特别的方法调用方式
常见的有:
1 to 10
1 + 1
....
注意:在scala中,±*/也是一个方法
示例:
val a = Math abs -10
print(a)
“对象.方法{}”的方式,该方式值适用于只有一个参数的方法,{}内除了指定参数,还可以写其他的语句
示例:
val a = Math.abs{-10}
val b = Math.abs{
println("正在调用该方法!")
-10
}
print(a, b)
如果传入了多个参数,它会取最后一个
val b = Math.abs{
println("正在调用该方法!")
-10
-20
} // 结果b的值为20
val b = Math.abs{
println("正在调用该方法!")
-10
"aa"
} // 这个执行会报错,因为字符串不能求绝对值
应用场景:
可以对传入的值进行判断
val a = 10
val b = Math.abs{
if(a >= 0){
a+5 // 整数就加5,然后再求绝对值
} else {
a-5 // 负数就减5在求绝对值
}
}
如果方法没有参数,那么在调用的时候可以不用写()
示例:
def func1() = print("方法被调用!")
func1 // 正常执行
在定义方法时,如果方法的返回值是unit(没有返回值),那么方法参数列表后面的=可以省略不写
示例:
def func2(){print("方法被调用!")}
func2