在 Scala 中,循环是控制结构的一部分,用于重复执行代码块。Scala 提供了几种常见的循环结构,如 forwhiledo...while 循环。Scala 也注重函数式编程,因此 for 循环等可以与集合操作结合使用,形成更简洁和更高效的循环方式。


📖 目录

  1. for 循环
  2. while 循环
  3. do...while 循环
  4. 增强的 for 循环
  5. breakcontinue
  6. 参考资料

1. for 循环

for 循环是最常用的循环结构之一,通常用于遍历集合、数组、范围等数据结构。Scala 的 for 循环也可以作为一个表达式返回一个值,这使得它比许多其他编程语言中的 for 循环更具灵活性。

基本语法:

for (variable <- collection) {
  // 每次迭代时执行的代码
}

示例:

val numbers = List(1, 2, 3, 4, 5)

for (num <- numbers) {
  println(num)
}

输出:

1
2
3
4
5

在这个例子中,for 循环遍历了 numbers 列表中的每个元素,并将其打印出来。


2. while 循环

while 循环在给定的条件为 true 时不断执行循环体。它的语法格式是:

基本语法:

while (condition) {
  // 条件为 true 时执行的代码
}

示例:

var i = 0
while (i < 5) {
  println(i)
  i += 1
}

输出:

0
1
2
3
4

在这个例子中,while 循环会一直执行,直到 i 的值达到 5 为止。


3. do...while 循环

do...while 循环与 while 循环类似,不同的是,do...while 循环会先执行一次循环体,然后再判断条件是否成立。因此,无论条件是否为 true,循环体至少执行一次。

基本语法:

do {
  // 循环体代码
} while (condition)

示例:

var i = 0
do {
  println(i)
  i += 1
} while (i < 5)

输出:

0
1
2
3
4

这个例子展示了 do...while 循环的使用方式。无论初始值如何,循环体至少执行一次。


4. 增强的 for 循环

Scala 的 for 循环支持一些额外的功能,比如过滤条件和多变量绑定。增强的 for 循环可以让你在遍历集合时进行更复杂的操作。

示例:

使用过滤条件:

val numbers = List(1, 2, 3, 4, 5, 6)

for (num <- numbers if num % 2 == 0) {
  println(num)
}

输出:

2
4
6

多变量绑定:

val pairs = List((1, "one"), (2, "two"), (3, "three"))

for ((num, word) <- pairs) {
  println(s"Number: $num, Word: $word")
}

输出:

Number: 1, Word: one
Number: 2, Word: two
Number: 3, Word: three

在这个例子中,for 循环遍历了 pairs 列表中的元组,并分别解构元组中的元素,赋值给 numword

生成新集合:

Scala 的 for 循环可以作为一个表达式,返回一个新集合:

val numbers = List(1, 2, 3, 4, 5)
val doubled = for (n <- numbers) yield n * 2

println(doubled)  // 输出:List(2, 4, 6, 8, 10)

这里,yield 用于生成一个新集合,其中每个元素都是原始集合元素的两倍。


5. breakcontinue

Scala 默认没有 breakcontinue 语句,但可以通过其他方式来模拟它们的行为。常见的方法是使用 @annotation.tailrec 注解,或通过 breakable 块来模拟 break 行为。

使用 breakable 模拟 break

import scala.util.control.Breaks._

val numbers = List(1, 2, 3, 4, 5)

breakable {
  for (num <- numbers) {
    if (num == 3) break()
    println(num)
  }
}

输出:

1
2

在这个例子中,程序在遇到数字 3 时退出了循环,模拟了 break 的行为。

模拟 continue

Scala 没有 continue,但可以通过 if 语句跳过当前迭代。

val numbers = List(1, 2, 3, 4, 5)

for (num <- numbers) {
  if (num == 3) {
    // 跳过当前循环
    // continue 相当于不执行后面的代码
    println("Skipping 3")
    // 使用 return 跳过当前循环
  } else {
    println(num)
  }
}

输出:

1
2
Skipping 3
4
5


6. 参考资料


Scala 的循环结构提供了丰富的功能,允许开发者在函数式编程风格下高效地操作数据集合。通过增强的 for 循环、过滤器、yield 等功能,Scala 的循环结构可以非常简洁地表达复杂的逻辑。