1. for语句的基本格式
1.1基本循环格式
for (变量 <- 集合) {
// 循环体语句
}
其中,变量 <- 集合 表示从集合中提取每个元素并赋值给变量,集合可以是数组、列表、范围等
1.2 带过滤条件的格式
for (变量 <- 集合 if 条件表达式) {
// 满足条件时执行的语句
}
可以通过 if 子句添加过滤条件,只处理满足条件的元素。
1.3 嵌套循环
for (
变量1 <- 集合1;
变量2 <- 集合2;
if 条件 // 可选的过滤条件
) {
// 循环体语句
}
多个生成器之间用分号分隔,相当于嵌套循环。
1.4 带 yield 的生成器格式
val 新集合 = for (变量 <- 集合 if 条件) yield 表达式
这种形式会根据循环中的表达式生成一个新的集合,称为 for 推导式。
2.for和while的区别
2.1 语法结构
-
for循环语法更紧凑,通常将循环变量初始化、循环条件、迭代逻辑集中在一个语句中(不同语言语法略有差异)。例:// 遍历集合(最常见用法) for (i <- 1 to 5) { println(i) } // 带条件和迭代逻辑的传统风格(类似 Java) for (var i = 0; i < 5; i++) { println(i) } -
while循环仅包含循环条件,循环变量的初始化和迭代逻辑需要在循环外单独定义。 示例:var i = 0 // 初始化在循环外 while (i < 5) { // 仅包含条件 println(i) i += 1 // 迭代逻辑在循环体内 }
2.2 适用场景
-
for循环更适合:- 已知循环次数或遍历一个明确的集合(如数组、列表、范围)。
- 需要简洁表达 “从 A 到 B 依次处理” 的逻辑(如遍历索引、元素)。
- 结合过滤、映射等操作(如 Scala 的 for 推导式)。
示例:遍历列表中的元素并筛选:
val fruits = List("apple", "banana", "orange") for (f <- fruits if f.length > 5) { println(f) // 只打印长度大于5的水果 } -
while循环更适合:- 循环次数不确定,依赖于某个动态条件(如 “直到用户输入退出命令为止”)。
- 需要更灵活地控制循环变量的修改(如非递增 / 递减的迭代逻辑)。
示例:等待某个条件满足:
var isReady = false while (!isReady) { // 检查是否准备就绪(如资源加载完成) isReady = checkStatus() Thread.sleep(1000) }
3.continue语句
在 Scala 中,并没有像 Java 或 C 语言中那样的 `continue` 关键字来直接跳过当前循环迭代。但可以通过其他方式实现类似 `continue` 的效果,主要有以下两种常用方法:
3.1 使用条件判断(推荐)
通过 if 表达式包裹需要执行的代码,当不满足条件时,自然跳过当前迭代,达到类似 continue 的效果。
示例:打印 1-10 中的奇数(跳过偶数)
for (i <- 1 to 10) {
if (i % 2 != 0) { // 仅当为奇数时执行
println(i)
}
// 若为偶数,不进入 if 块,直接进入下一次迭代(相当于 continue)
}
3.2 使用 scala.util.control.Breaks(适用于复杂逻辑)
Scala 提供了 Breaks 工具类,其中的 breakable 和 break 可以模拟循环控制流。虽然主要用于 break,但结合条件也可实现 continue。
示例:使用 Breaks 实现跳过逻辑
import scala.util.control.Breaks._
for (i <- 1 to 10) {
breakable { // 将单次迭代的逻辑包裹在 breakable 中
if (i % 2 == 0) {
break() // 当为偶数时,跳出当前 breakable 块(即跳过本次迭代)
}
println(i) // 仅奇数会执行此句
}
}