Scala 系列(三)—— 流程控制語句

1、條件表達式if

Scala 中的 if/else 語法結構與 Java 中的同樣,惟一不一樣的是,Scala 中的 if 表達式是有返回值的。java

object ScalaApp extends App {

  val x = "scala"
  val result = if (x.length == 5) "true" else "false"
  print(result)
  
}

在 Java 中,每行語句都須要使用 ; 表示結束,可是在 Scala 中並不須要。除非你在單行語句中寫了多行代碼。git

2、塊表達式

在 Scala 中,可使用 {} 塊包含一系列表達式,塊中最後一個表達式的值就是塊的值。github

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 = ()

3、循環表達式while

Scala 和大多數語言同樣,支持 whiledo ... while 表達式。大數據

object ScalaApp extends App {

  var n = 0

  while (n < 10) {
    n += 1
    println(n)
  }

  // 循環至少要執行一次
  do {
    println(n)
  } while (n > 10)
}

4、循環表達式for

for 循環的基本使用以下:scala

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 推導式。3d

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)

5、異常處理try

和 Java 中同樣,支持 try...catch...finally 語句。code

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 語句的返回值,以下:element

scala> def g():Int = try return 1 finally  return  2
g: ()Int

// 方法 g() 總會返回 2
scala> g()
res3: Int = 2

6、條件選擇表達式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", "B", "C", "D", "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;

7、沒有break和continue

額外注意一下:Scala 中並不支持 Java 中的 break 和 continue 關鍵字。

8、輸入與輸出

在 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}.")

參考資料

  1. Martin Odersky . Scala 編程 (第 3 版)[M] . 電子工業出版社 . 2018-1-1
  2. 凱.S.霍斯特曼 . 快學 Scala(第 2 版)[M] . 電子工業出版社 . 2017-7

更多大數據系列文章能夠參見 GitHub 開源項目大數據入門指南

相關文章
相關標籤/搜索