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 = () 复制代码
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 循环的基本使用如下:
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) 复制代码
和 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 类似于 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 有以下三点不同:
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; 复制代码
额外注意一下: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}.") 复制代码