Scala 控制结构

条件语句

if 语句

if 语句用于测试某个条件是否为真,如果条件为真,则执行大括号 {} 中的代码,否则不执行,示例如下:

1val num = 10
2if (num > 0) {
3  println("Number is positive")
4}
5// Expected output:
6// Number is positive

if-else 语句

if-else 语句用于当 if 条件测试结果为假时执行另一部分代码,示例如下:

1val num = -10
2if (num > 0) {
3  println("Number is positive")
4} else {
5  println("Number is non-positive")
6}
7// Expected output:
8// Number is non-positive

if-else if-else 语句

可以在 if-else 语句中添加多个 else if 语句,示例如下:

 1val num = 0
 2if (num > 0) {
 3  println("Number is positive")
 4} else if (num < 0) {
 5  println("Number is negative")
 6} else {
 7  println("Number is zero")
 8}
 9// Expected output:
10// Number is zero

条件表达式

在 Scala 中,if-else 语句也可以用作表达式,称作条件表达式,也就是说 if-else 语句也可以有返回值,示例如下:

1val num = 10
2val result = if (num % 2 == 0) "Even" else "Odd"
3println(result) // Even

在上面的示例中,if-else 表达式根据 num 是偶数还是奇数返回 “Even” 或 “Odd” 字符串。

循环语句

while 循环

一个使用 while 循环实现求最大公约数的示例如下:

 1def gcd(x: Long, y: Long): Long = {
 2    var a = x
 3    var b = y
 4    while (a != 0) {
 5        val temp = a
 6        a = b % a
 7        b = temp
 8    }
 9    b
10}

do-while 循环

一个用 do-while 循环实现不断读入控制台输入并打印的示例如下:

1import scala.io.StdIn.readLine
2
3object Main extends App {
4  var line = ""
5  do {
6    line = readLine("Enter a line: ")
7    println(s"Read line: $line")
8  } while (line != "")
9}

for 循环

for 循环可以用于迭代集合、数组、字符串等。以下是一个简单的示例:

 1val nums = List(1, 2, 3, 4, 5)
 2for (num <- nums) {
 3  println(num)
 4}
 5// Expected output:
 6// 1
 7// 2
 8// 3
 9// 4
10// 5

使用条件过滤:

1val nums = List(1, 2, 3, 4, 5)
2for (num <- nums if num % 2 == 0) {
3  println(num) // 打印偶数
4}
5// Expected output:
6// 2
7// 4

在 for 循环中使用多个生成器:

 1val nums = List(1, 2, 3)
 2val chars = List('a', 'b', 'c')
 3for (
 4  num <- nums;
 5  char <- chars
 6) {
 7  println(s"$num$char")
 8}
 9// Expected output:
10// 1a
11// 1b
12// 1c
13// 2a
14// 2b
15// 2c
16// 3a
17// 3b
18// 3c

使用 yield 关键字遍历并处理集合中的每个元素并生成一个新的集合,例如打印一个集合中的每个数字的平方:

1val nums = List(1, 2, 3, 4, 5)
2val squares = for (num <- nums) yield num * num
3println(squares)
4// Expected output:
5// List(1, 4, 9, 16, 25)
  • 在 for 循环中使用 {} 代码块通常是为了循环的副作用,例如输出到控制台。
  • 在函数式编程中,使用 yield 关键字生成一个新的集合是非常常见的操作。

match 语句

Scala 的 match 语句类似于其他编程语言中的 switch 语句,但更加灵活。使用 match,你可以根据表达式的值匹配一系列情况(case),并执行相应的代码块。Scala 的 match 表达式还支持模式匹配,也就是说它能够根据数据的结构来选择代码分支。

在 Scala 中,match 语句的基本语法如下:

1expression match {
2  case pattern1 => result1
3  case pattern2 => result2
4  case pattern3 => result3
5  case _ => defaultResult
6}

在上面的例子中,expression 是要匹配的值,pattern1pattern2pattern3 是匹配模式,result1result2result3 是匹配成功时返回的结果,defaultResult 是所有模式都匹配失败时返回的结果。

一个简单的 match 语句示例如下:

1val num = 3
2val result = num match {
3  case 1 => "one"
4  case 2 => "two"
5  case 3 => "three"
6  case _ => "other"
7}
8println(result) // three

异常处理

在 Scala 2 中,异常处理与 Java 非常相似,它们都使用 trycatchfinally 代码块来捕获和处理异常。Scala 异常处理相比于 Java 一个关键区别是 catch 代码块使用模式匹配来处理不同的异常类型。

基本语法

 1try {
 2  // Protected code block
 3  // Code that might throw an exception
 4} catch {
 5  // Handling exceptions
 6  case ex: NullPointerException => // Handle null pointer exception
 7  case ex: ArithmeticException => // Handle arithmetic exception
 8  case _ => // Handle all other exceptions
 9} finally {
10  // Cleanup code
11  // Code that executes regardless of whether an exception occurred
12}

下面是一个具体的示例:

 1def divide(a: Int, b: Int): Int = {
 2  try {
 3    a / b
 4  } catch {
 5    case e: ArithmeticException => {
 6      println("An arithmetic exception occurred")
 7      0 // Return a default value
 8    }
 9  } finally {
10    println("Division operation completed")
11  }
12}
13
14val result = divide(10, 0) // Attempt to divide by 0
15println(s"The result is: $result")
16// Expected output:
17// An arithmetic exception occurred
18// Division operation completed
19// The result is: 0

上面示例展示了在除法运算中如何捕获算术异常 ArithmeticException,并在异常发生时返回默认值 0。无论是否触发异常,finally 代码块始终都会被执行,用于资源清理等后续操作。

省略 finally 代码块

在 Scala 中,finally 代码块是可选的。如果只想捕获异常而不需要执行清理代码,则可以省略 finally 代码块。例如:

 1def divide(a: Int, b: Int): Int = {
 2  try {
 3    a / b
 4  } catch {
 5    case e: ArithmeticException => {
 6      println("An arithmetic exception occurred")
 7      0 // Return a default value
 8    }
 9  }
10}
11
12val result = divide(10, 0) // Attempt to divide by 0
13println(s"The result is: $result")
14// Expected output:
15// An arithmetic exception occurred
16// The result is: 0

使用 throw 抛出异常

与 Java 一样,Scala 也使用 throw 关键字抛出异常,示例如下:

1def checkAge(age: Int): Unit = {
2  if (age < 18) {
3    throw new IllegalArgumentException("Age must be at least 18")
4  }
5  println("Validation passed")
6}

总结

  • 相比于 Java,Scala 中没有提供 continue 和 break 关键字。
下一页