【大纲】
【正文】
1.【结论】方法语法
def 方法名(参数名:参数类型, 参数名:参数类型): 返回值类型 = {
方法体代码块
}
# 注意:
0.参数类型不能省略
1.返回值语句可省略return关键字,默认是块表达式{}的值
2.=的作用是将方法体的返回值赋值给方法。
示例
# 定义方法
scala> def max(a:Int, b:Int):Int = {if (a > b) {a} else {b}}
max: (a: Int, b: Int)Int
# 省略方法体的{}
scala> def max(a:Int, b:Int):Int = if (a > b) a else b
max: (a: Int, b: Int)Int
# 返回值是Unit
scala> def max(a:Int, b:Int):Unit = if (a > b) println(a) else println(b)
max: (a: Int, b: Int)Unit
2.【结论】返回值类型推断
返回值类型推断。即,返回值类型可省略,scala会自动推断
# 注意:
0.返回值类型是Unit时,这个的方法又叫做过程procedure,过程的=可省略
1.当省略了=时,方法的返回值一定是Unit,哪怕方法体{}中给了返回值也不好使
2.当方法体只有一行代码时,方法体的{}可省略,但与=同时省略会报错
示例
# 返回值类型推断
scala> def max(a:Int, b:Int) = if (a > b) a else b
max: (a: Int, b: Int)Int
# 省略返回值Unit
scala> def max(a:Int, b:Int) = if (a > b) println(a) else println(b)
max: (a: Int, b: Int)Unit
# 过程的=可省略
scala> def max(a:Int, b:Int) {if (a > b) println(a) else println(b)}
max: (a: Int, b: Int)Unit
# 当省略了=时,函数的返回值一定是Unit,哪怕方法体{}中给了返回值也不好使
scala> def max(a:Int, b:Int){var result = if (a > b) println(a) else println(b); result}
max: (a: Int, b: Int)Unit
3.【结论】递归方法不能省略返回值类型
递归方法,省略返回值类型,会直接代码报错
# 递归方法 求5的阶乘
object Recursion {
def recursion(n:Int):Int = if(n == 1) 1 else n*(recursion(n - 1))
def main(args: Array[String]): Unit = {
val a = recursion(5)
println(a) // 效果:120
}
}
4.【结论】惰性调用方法
0.语法
lazy val 变量名a = 调用方法A
1.作用
惰性调用方法A时,方法A并未执行,当后边代码使用变量a时,方法A才执行
# 注意:
0.lazy不能修饰var,代码会直接报错
示例
# 惰性调用方法
scala> def getSum(a:Int, b:Int) = a + b
getSum: (a: Int, b: Int)Int
scala> lazy val s = getSum(1, 2)
s: Int = <lazy>
scala> println(s)
3
5.方法参数
5.1.【结论】参数默认值
定义方法时,可以给参数设置默认值
def 方法名(参数名: 数据类型 = 默认值, 参数名: 数据类型 = 默认值): 返回值类型 = {
方法体代码块
}
示例
# 参数默认值
scala> def getSum(a:Int = 1, b:Int = 2) = a + b
getSum: (a: Int, b: Int)Int
scala> val s = getSum()
s: Int = 3
5.2.【结论】带名传参
调用方法时,可指定参数名来进行赋值
示例
scala> def getSum(a:Int = 1, b:Int = 2) = a + b
getSum: (a: Int, b: Int)Int
scala> val s = getSum(b = 3)
s: Int = 4
5.3.【结论】变长参数
定义方法时,可定义一个变长参数,当调用此方法时,可传入0~多个参数来对应这个变长参数
def 方法名(参数名: 参数类型, 参数名: 参数类型*): 返回值类型 = {
方法体代码块
}
# 注意:
0.参数里的*表示调用时传入的参数可以0~多个
1.每个方法只能有一个变长参数,且这个变长参数要放到参数列表的最后
2.变长参数本质是个集合Seq(后边会讲)
示例
# 变长参数
scala> def getSum(a:Int, b:Int*) = a + b.sum
getSum: (a: Int, b: Int*)Int
scala> val s = getSum(1,2,3,4,5)
s: Int = 15
6.方法的调用方式
6.1.【结论】后缀调用
对象名或类名.方法名(参数)
示例
# 后缀调用
scala> val a = Math.abs(-2)
a: Int = 2
6.2.【结论】中缀调用
对象名或类名 方法名 参数
# 注意:
0.如果有多个参数,使用()括起来
1.scala中,所有的操作符,都是中缀调用的方法
示例
# 中缀调用
scala> val a = Math abs -2
a: Int = 2
# 操作符即方法
scala> val a = 1 + 1
a: Int = 2
6.3.【结论】花括号调用
对象名或类名.方法名{
表达式1
表达式2
}
# 注意:
0.方法只有1个参数时才能使用
示例
scala> val a = Math.abs{println(1);println(2);-2}
1
2
a: Int = 2
6.4.【结论】无括号调用
如果方法没有参数,调用时可省略方法名后的()
示例
scala> def run() = println("run")
run: ()Unit
scala> run
run