内建控制循环语句-for循环

68 阅读3分钟

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)  // 仅奇数会执行此句
  }
}