val a = 5
val b = 10
val blockResult = {
println("Calculating...")
val sum = a + b
sum // 块表达式的最后一个语句是 sum, 所以它的值被赋给 blockResult
}
println(s"The result from the block is: $blockResult") // 输出 15
二、循环结构
for 循环
Scala 的 for 循环远比传统命令式语言的 for 循环更灵活,它更像一个'生成器'。
for 循环特性
语法/示例
说明
遍历范围 (Range)
for (i <- 1 to 10) for (i <- 1 until 10)
to 包含上界 (1-10)。 until 不包含上界 (1-9)。
循环守卫 (Guard)
for (i <- 1 to 10 if i % 2 == 0)
在遍历过程中加入 if 条件进行过滤,只有满足条件的元素才会被处理。
嵌套循环
for (i <- 1 to 3; j <- 1 to 3)
可以将多个生成器用分号隔开写在同一行,代码更紧凑。
for 推导式 (Comprehension)
val squares = for (i <- 1 to 5) yield i * i
使用 yield 关键字,将 for 循环的每次迭代结果收集起来,构建成一个新的集合。
代码案例
// 遍历范围并使用循环守卫
println("偶数 in 1 to 10:")
for (i <- 1 to 10 if i % 2 == 0) {
print(s"$i ")
}
println()
// 嵌套循环打印坐标
println("坐标:")
for (i <- 1 to 2; j <- 'a' to 'b') {
println(s"($i, $j)")
}
// for 推导式生成一个 List[Int]
val squares = for (i <- 1 to 5) yield i * i
println(s"Squares: $squares") // 输出:Squares: List(1, 4, 9, 16, 25)
val num = -5
val sign = if (num > 0) "positive"
else if (num < 0) "negative"
else "zero"
println(s"The sign of $num is: $sign")
解析: if-else if-else 结构作为表达式,其结果可以直接赋值给 sign 变量。
答案二:
for (i <- 5 to 1 by -1) {
println(i)
}
解析: for 循环可以通过 by 关键字指定步长,步长为负数时即为递减。
答案三:
for (i <- 1 until 100 if i % 7 == 0) {
println(i)
}
解析: until 创建了一个不包含上界 (100) 的范围,循环守卫 if i % 7 == 0 过滤出了 7 的倍数。
答案四:
for (i <- 1 to 50 if i % 3 == 0 && i % 5 == 0) {
println(i)
}
解析: 循环守卫可以包含复杂的逻辑条件,如使用 && (与)。
答案五:
for (i <- 1 to 4) {
for (j <- 1 to 4) {
print("* ")
}
println() // 每行结束后换行
}
解析: 外层循环控制行数,内层循环控制每行打印的星号数量。
答案六:
val words = List("apple", "banana", "cherry")
val upperWords = for (word <- words) yield word.toUpperCase
println(upperWords) // 输出:List(APPLE, BANANA, CHERRY)
解析: for-yield 结构遍历 words 列表,对每个元素 word 应用 .toUpperCase 方法,并将结果收集到一个新的 List 中。
答案七:
var sum = 0
var i = 1
while (i <= 100) {
sum += i
i += 1
}
println(s"The sum is: $sum")
解析: 经典的 while 循环用法,需要一个可变的循环控制变量 i 和累加变量 sum。
答案八:
import scala.util.control.Breaks._
val numbers = List(1, 4, 9, 16, 25, 36, 49)
breakable {
for (num <- numbers) {
if (num > 30) {
println(s"Found number greater than 30: $num")
break
}
}
}
解析: breakable 包裹了整个循环,当 num > 30 条件满足时,break 会中断 breakable 块的执行,从而跳出循环。
答案九:
val x = 3
val y = 4
val result = {
println("Performing calculation...")
val xSquare = x * x
val ySquare = y * y
xSquare + ySquare // 这是块的最后一个表达式,它的值将赋给 result
}
println(result) // 输出 25
for (i <- 1 to 100) {
if (i % 15 == 0) {
println("FizzBuzz")
} else if (i % 3 == 0) {
println("Fizz")
} else if (i % 5 == 0) {
println("Buzz")
} else {
println(i)
}
}