📜  Scala 中的 For 循环(1)

📅  最后修改于: 2023-12-03 15:19:58.083000             🧑  作者: Mango

Scala 中的 For 循环

简介

Scala 中的 For 循环语法与 Java 中相似,但比 Java 更为强大。Scala For 循环语句也支持高级技巧,例如将一个集合转换成另一个集合。这篇文章将会阐述这些技巧。

基本语法

使用 Scala 中的 for 循环语句,我们可以对一组集合中的元素进行迭代。语法如下所示:

for (element <- collection) {
  // 对集合中的每个元素进行操作
}

下面的示例演示了如何遍历一个基本类型数组:

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

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

输出:

1
2
3
4
5

我们可以在 for 循环中使用多个生成器,使其可以迭代多个集合:

val x = List(1, 2, 3)
val y = List("a", "b", "c")

for (i <- x; j <- y) {
  println(i + " " + j)
}

输出:

1 a
1 b
1 c
2 a
2 b
2 c
3 a
3 b
3 c

原因是该代码等价于下面的代码:

x.foreach(i => y.foreach(j => println(i + " " + j)))

可以看到,循环体生成的二元组是由 x 和 y 中的元素对组成的。

高级技巧
滤波器

我们可以使用 if 语句添加过滤器,以过滤生成器中的无用值。例如,我们可以使用以下代码块输出偶数:

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

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

输出:

2
4

这种方法比使用 filter 方法更简单、更容易阅读。除此之外,还可以不使用 if 关键字,使用多个生成器来实现相同的过滤:

val x = List(1, 2, 3)
val y = List("a", "b", "c")

for (i <- x if i % 2 == 0; j <- y) {
  println(i + " " + j)
}

输出:

2 a
2 b
2 c
yield

Scala 的 for 循环提供了另一个非常强大的功能,也就是 yield 关键字。yield 关键字会创建新的集合,返回该集合的地址。我们可以使用 yield 语句来构建一个新的集合,该集合由原始集合中生成器的结果组成。例如,我们可以将以下代码块的结果存储在一个字符串集合中:

val fruits = List("apple", "banana", "orange")

val uppercaseFruits = for (f <- fruits) yield f.toUpperCase

println(uppercaseFruits) // List(APPLE, BANANA, ORANGE)

输出:

List(APPLE, BANANA, ORANGE)

我们还可以使用多个生成器来创建一个新的集合:

for {
  i <- 1 to 3
  j <- 1 to 3
} yield (i, j)

输出:

Vector((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
惰性计算

Scala 的 for 循环会使用惰性计算,这意味着不会立即对集合进行计算。实际上,当您创建一个 for 表达式时,Scala 只会创建一个包含用于计算结果的“计划”。然后,在调用 yield 或 foreach 时才会实际执行计划,并返回生成的值。

下面是一个演示惰性计算的示例:

val data = List(1, 2, 3, 4, 5, 6) // 定义一个列表
val result = for (x <- data if x % 2 == 0) yield x * 2 // 构建计划
println(result) // 输出结果 [4, 8, 12]

在第二行代码中,Scala 仅仅是构建了一个计划,而并没有立即执行它。只有在调用 println 时,该计划才被实际执行并返回结果。

总结

Scala For 循环语句不仅可以用来遍历集合中的元素,还支持过滤、嵌套迭代、惰性计算、yield 等高级功能。在 Scala 中,for 循环是一种非常强大和灵活的迭代方式。