Scala 系列(三)—— 流程控制語句
阿新 • • 發佈:2019-12-31
一、條件表示式if
Scala 中的 if/else 語法結構與 Java 中的一樣,唯一不同的是,Scala 中的 if 表示式是有返回值的。
object ScalaApp extends App {
val x = "scala"
val result = if (x.length == 5) "true" else "false"
print(result)
}
複製程式碼
在 Java 中,每行語句都需要使用 ;
表示結束,但是在 Scala 中並不需要。除非你在單行語句中寫了多行程式碼。
二、塊表示式
在 Scala 中,可以使用 {}
塊包含一系列表示式,塊中最後一個表示式的值就是塊的值。
object ScalaApp extends App {
val result = {
val a = 1 + 1; val b = 2 + 2; a + b
}
print(result)
}
// 輸出: 6
複製程式碼
如果塊中的最後一個表示式沒有返回值,則塊的返回值是 Unit 型別。
scala> val result ={ val a = 1 + 1; val b = 2 + 2 }
result: Unit = ()
複製程式碼
三、迴圈表示式while
Scala 和大多數語言一樣,支援 while
和 do ... while
表示式。
object ScalaApp extends App {
var n = 0
while (n < 10) {
n += 1
println(n)
}
// 迴圈至少要執行一次
do {
println(n)
} while (n > 10)
}
複製程式碼
四、迴圈表示式for
for 迴圈的基本使用如下:
object ScalaApp extends App {
// 1.基本使用 輸出[1,9)
for (n <- 1 until 10) {print(n)}
// 2.使用多個表示式生成器 輸出: 11 12 13 21 22 23 31 32 33
for (i <- 1 to 3 ; j <- 1 to 3) print(f"${10 * i + j}%3d")
// 3.使用帶條件的表示式生成器 輸出: 12 13 21 23 31 32
for (i <- 1 to 3; j <- 1 to 3 if i != j) print(f"${10 * i + j}%3d")
}
複製程式碼
除了基本使用外,還可以使用 yield
關鍵字從 for 迴圈中產生 Vector,這稱為 for 推導式。
scala> for (i <- 1 to 10) yield i * 6
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(6,12,18,24,30,36,42,48,54,60)
複製程式碼
五、異常處理try
和 Java 中一樣,支援 try...catch...finally
語句。
import java.io.{FileNotFoundException,FileReader}
object ScalaApp extends App {
try {
val reader = new FileReader("wordCount.txt")
} catch {
case ex: FileNotFoundException =>
ex.printStackTrace()
println("沒有找到對應的檔案!")
} finally {
println("finally 語句一定會被執行!")
}
}
複製程式碼
這裡需要注意的是因為 finally 語句一定會被執行,所以不要在該語句中返回值,否則返回值會被作為整個 try 語句的返回值,如下:
scala> def g():Int = try return 1 finally return 2
g: ()Int
// 方法 g() 總會返回 2
scala> g()
res3: Int = 2
複製程式碼
六、條件選擇表示式match
match 類似於 java 中的 switch 語句。
object ScalaApp extends App {
val elements = Array("A","B","C","D","E")
for (elem <- elements) {
elem match {
case "A" => println(10)
case "B" => println(20)
case "C" => println(30)
case _ => println(50)
}
}
}
複製程式碼
但是與 Java 中的 switch 有以下三點不同:
- Scala 中的 case 語句支援任何型別;而 Java 中 case 語句僅支援整型、列舉和字串常量;
- Scala 中每個分支語句後面不需要寫 break,因為在 case 語句中 break 是隱含的,預設就有;
- 在 Scala 中 match 語句是有返回值的,而 Java 中 switch 語句是沒有返回值的。如下:
object ScalaApp extends App {
val elements = Array("A","E")
for (elem <- elements) {
val score = elem match {
case "A" => 10
case "B" => 20
case "C" => 30
case _ => 50
}
print(elem + ":" + score + ";")
}
}
// 輸出: A:10;B:20;C:30;D:50;E:50;
複製程式碼
七、沒有break和continue
額外注意一下:Scala 中並不支援 Java 中的 break 和 continue 關鍵字。
八、輸入與輸出
在 Scala 中可以使用 print、println、printf 列印輸出,這與 Java 中是一樣的。如果需要從控制檯中獲取輸入,則可以使用 StdIn
中定義的各種方法。
val name = StdIn.readLine("Your name: ")
print("Your age: ")
val age = StdIn.readInt()
println(s"Hello,${name}! Next year,you will be ${age + 1}.")
複製程式碼
參考資料
- Martin Odersky . Scala 程式設計 (第 3 版)[M] . 電子工業出版社 . 2018-1-1
- 凱.S.霍斯特曼 . 快學 Scala(第 2 版)[M] . 電子工業出版社 . 2017-7
更多大資料系列文章可以參見 GitHub 開源專案: 大資料入門指南