📅  最后修改于: 2023-12-03 15:19:58.083000             🧑  作者: Mango
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
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 循环是一种非常强大和灵活的迭代方式。