循环语句 #
一、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 |
| 递归 | 函数式循环 | 任意 |
最佳实践 #
- 优先使用 for 推导式
- 使用守卫过滤元素
- 避免可变状态
- 使用函数式方法替代命令式循环
下一步,让我们学习 函数基础!
最后更新:2026-03-27