循环语句 #

一、for 循环 #

1.1 基本语法 #

scala
for (i <- 1 to 5) println(i)

1.2 Scala 3 新语法 #

scala
for i <- 1 to 5 do println(i)

1.3 使用花括号 #

scala
for {
  i <- 1 to 3
} {
  println(i)
}

二、范围生成 #

2.1 to 和 until #

scala
for i <- 1 to 5 do println(i)

for i <- 1 until 5 do println(i)

2.2 Range 方法 #

scala
for i <- 1 to 10 by 2 do println(i)

for i <- 10 to 1 by -1 do println(i)

for i <- Range(1, 10, 2) do println(i)

2.3 遍历集合 #

scala
val list = List(1, 2, 3, 4, 5)

for item <- list do println(item)

for item <- list if item > 2 do println(item)

三、for 推导式(yield) #

3.1 基本用法 #

使用 yield 生成新集合:

scala
val doubled = for i <- 1 to 5 yield i * 2
println(doubled)

val names = for name <- List("Alice", "Bob", "Charlie") yield name.toUpperCase
println(names)

3.2 yield 语法 #

scala
val result = for i <- 1 to 5 yield
  val doubled = i * 2
  doubled

val result2 = for i <- 1 to 5 yield i * 2

3.3 复杂推导式 #

scala
case class Person(name: String, age: Int)

val people = List(
  Person("Alice", 25),
  Person("Bob", 17),
  Person("Charlie", 30)
)

val adultNames = for
  person <- people
  if person.age >= 18
yield person.name

四、嵌套循环 #

4.1 多个生成器 #

scala
for
  i <- 1 to 3
  j <- 1 to 3
do
  println(s"($i, $j)")

4.2 等价写法 #

scala
for i <- 1 to 3 do
  for j <- 1 to 3 do
    println(s"($i, $j)")

4.3 嵌套推导式 #

scala
val pairs = for
  i <- 1 to 3
  j <- 1 to 3
yield (i, j)

println(pairs)

五、循环守卫 #

5.1 单个守卫 #

scala
for i <- 1 to 10 if i % 2 == 0 do println(i)

5.2 多个守卫 #

scala
for
  i <- 1 to 10
  if i % 2 == 0
  if i > 5
do
  println(i)

5.3 守卫与推导式 #

scala
val evenSquares = for
  i <- 1 to 10
  if i % 2 == 0
yield i * i

六、循环变量 #

6.1 定义中间变量 #

scala
for
  i <- 1 to 5
  squared = i * i
do
  println(s"$i squared is $squared")

6.2 复杂计算 #

scala
for
  x <- 1 to 10
  y = x * x
  z = y * y
yield (x, y, z)

七、while 循环 #

7.1 基本语法 #

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

7.2 传统语法 #

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

7.3 do-while #

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

7.4 while 与函数式风格 #

推荐使用递归代替 while:

scala
@annotation.tailrec
def countdown(n: Int): Unit =
  if n > 0 then
    println(n)
    countdown(n - 1)

countdown(5)

八、循环控制 #

8.1 使用 return #

scala
def findFirstNegative(list: List[Int]): Int =
  for item <- list do
    if item < 0 then return item
  0

8.2 使用 Option #

scala
def findFirstNegative(list: List[Int]): Option[Int] =
  var result: Option[Int] = None
  var i = 0
  while i < list.length && result.isEmpty do
    if list(i) < 0 then result = Some(list(i))
    i += 1
  result

8.3 函数式方法 #

scala
def findFirstNegative(list: List[Int]): Option[Int] =
  list.find(_ < 0)

九、实用示例 #

9.1 遍历 Map #

scala
val scores = Map("Alice" -> 90, "Bob" -> 85, "Charlie" -> 95)

for (name, score) <- scores do
  println(s"$name: $score")

9.2 遍历多维数组 #

scala
val matrix = Array(
  Array(1, 2, 3),
  Array(4, 5, 6),
  Array(7, 8, 9)
)

for
  row <- matrix
  elem <- row
do
  println(elem)

9.3 文件处理 #

scala
import scala.io.Source

for
  line <- Source.fromFile("data.txt").getLines()
  if line.nonEmpty
do
  println(line)

9.4 并行处理 #

scala
val numbers = (1 to 100).toList

val results = for
  n <- numbers.par
  if n % 2 == 0
yield n * n

十、for 与函数式操作对比 #

10.1 for vs map #

scala
val doubled1 = for i <- 1 to 5 yield i * 2
val doubled2 = (1 to 5).map(_ * 2)

10.2 for vs filter + map #

scala
val result1 = for
  i <- 1 to 10
  if i % 2 == 0
yield i * i

val result2 = (1 to 10).filter(_ % 2 == 0).map(n => n * n)

10.3 for vs flatMap #

scala
val result1 = for
  i <- 1 to 3
  j <- 1 to 3
yield (i, j)

val result2 = (1 to 3).flatMap(i => (1 to 3).map(j => (i, j)))

十一、循环最佳实践 #

11.1 优先使用 for 推导式 #

scala
val squares = for i <- 1 to 10 yield i * i

val names = for name <- people if name.length > 3 yield name

11.2 避免可变状态 #

scala
var sum = 0
for i <- 1 to 10 do sum += i

val sum2 = (1 to 10).sum

11.3 使用函数式方法 #

scala
val result = list
  .filter(_ > 0)
  .map(_ * 2)
  .take(10)

11.4 使用递归代替 while #

scala
@annotation.tailrec
def factorial(n: Int, acc: Int = 1): Int =
  if n <= 1 then acc
  else factorial(n - 1, n * acc)

十二、Scala 2 与 Scala 3 对比 #

12.1 for 循环语法 #

Scala 2:

scala
for (i <- 1 to 5) {
  println(i)
}

Scala 3:

scala
for i <- 1 to 5 do println(i)

12.2 for 推导式语法 #

Scala 2:

scala
val result = for {
  i <- 1 to 5
  if i % 2 == 0
} yield i * 2

Scala 3:

scala
val result = for
  i <- 1 to 5
  if i % 2 == 0
yield i * 2

十三、总结 #

循环类型对比 #

类型 用途 返回值
for 循环 遍历执行 Unit
for 推导式 生成集合 集合
while 循环 条件循环 Unit
递归 函数式循环 任意

最佳实践 #

  1. 优先使用 for 推导式
  2. 使用守卫过滤元素
  3. 避免可变状态
  4. 使用函数式方法替代命令式循环

下一步,让我们学习 函数基础

最后更新:2026-03-27