Scala中的流程控制
阿新 • • 發佈:2022-02-11
一、分支控制if-else
//Scala中if-else語句中,程式碼塊內最後一句程式碼就是返回值
def main(args: Array[String]): Unit = {
var age:Int = 18;
if (age > 18){
"成年了"
}else{
"未成年"
}
}
注意:Scala中沒有三元運算子,由if-else替代了。
二、分支控制Switch
Scala中沒有switch語句,而是使用模式匹配來代替。
模式匹配:一個模式匹配包含了一系列備選項,每個備選項都開始於關鍵字case。每個備選項都包含一個模式及一到多個表示式。箭頭符號“=>”來隔離模式和表示式。
object Test {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
//類似於switch中的default,case _是全匹配。
case _ => "many"
}
}
輸出:many
match表示式還可以有不同資料型別的模式匹配,當發現一個匹配的模式後就不會繼續往下匹配了。
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
三、for迴圈控制
Scala也為for迴圈這一常見的控制結構提供了非常多的特性,這些for迴圈的特性被稱為for推導式或for表示式。
1、範圍資料迴圈(to):閉區間
for (i <- 1 to 3){
print(i+" ")
}
println()
i:迴圈變數;
<-:規定;
1 to 3:1到3閉合區間;
2、範圍資料迴圈(until):左閉右開區間
for (i <- 1 until 5){
print(i+" ")
}
println()
3、迴圈守衛
迴圈守衛,即迴圈保護式(也稱條件判斷式,守衛)。保護式為true則進入迴圈體內部,為false則跳過,類似於continue。
for (i <- 1 to 3 if i != 2){
print(i+" ")
}
println()
等價於
for (i <- 1 to 3){
if(i != 2){
print(i+" ")
}
}
println()
4、迴圈步長
for (i <- 1 to 10 by(2)){
print(i+" ")
}
println()
輸出:1 3 5 7 9
注:by表示步長
5、巢狀迴圈
for推導式中有多個表示式時需要用分號“;”來隔斷邏輯。當for迴圈中包含多個表示式時可以使用{}包含。
for (i <- 1 to 3;j <- 2 to 4){
println(i+" "+j)
}
輸出:
1 2
1 3
1 4
2 2
2 3
2 4
3 2
3 3
3 4
6、引入變數迴圈
for (i <- 1 to 3;j = i-2){
println(i+" "+j)
}
輸出:
1 -1
2 0
3 1
相當於:
for (i <- 1 to 3){
var j:Int = i-2
println(i+" "+j)
}
7、迴圈返回值
// yield後面也可以跟表示式,例如{i*2}
var res = for (i <- 1 to 3) yield i println(res) 輸出: Vector(1, 2, 3)
注意:這種方式在實際開發中很少使用。
8、倒序列印
for (i <- 1 to 4 reverse){
print(i + " ")
}
輸出:
4 3 2 1
四、While迴圈
Scala中的while迴圈用法於Java一致。
五、迴圈中斷
Scala內建控制結構特地去掉了break和continue,是為了更好的適應函數語言程式設計,推薦使用函式式的風格解決break和continue的功能,而不是一個關鍵字。Scala中使用breakable控制結構來實現break和continue功能。
1、異常中斷
def main(args: Array[String]): Unit = { try{ for (i <- 1 to 10){ print(i + " ") if (i== 5) throw new RuntimeException } }catch { case e => } println("正常迴圈結束") }
2、使用Scala自帶的函式退出
import scala.util.control.Breaks._ def main(args: Array[String]): Unit = { breakable( for (i <- 1 to 10){ print(i)
//break省略了() if (i == 5)break } ) }