Scala 的 for 循环(也称为 for 推导式)功能强大,支持多种迭代场景。以下是一些常见的练习案例,帮助你熟悉其用法:
1. 基础迭代:打印 1 到 10 的数字
// 打印1到10(左闭右开,需用until或to)
for (i <- 1 to 10) {
print(i + " ")
}
// 输出:1 2 3 4 5 6 7 8 9 10
// 用until(不包含结束值)
for (i <- 1 until 10) {
print(i + " ")
}
// 输出:1 2 3 4 5 6 7 8 9
2. 嵌套循环:打印九九乘法表
for (i <- 1 to 9; j <- 1 to i) {
print(s"$j*$i=${i*j}\t")
if (j == i) println() // 每行结束换行
}
输出:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
3. 条件过滤(守卫):打印偶数
// 筛选1-20中的偶数
for (i <- 1 to 20 if i % 2 == 0) {
print(i + " ")
}
// 输出:2 4 6 8 10 12 14 16 18 20
4. 生成新集合(yield):转换元素
// 将1-5的数字翻倍,生成新集合
val doubled = for (i <- 1 to 5) yield i * 2
println(doubled) // 输出:Vector(2, 4, 6, 8, 10)
// 筛选并转换:字符串集合中取长度>3的元素,转为大写
val words = List("apple", "cat", "banana", "dog")
val longWords = for (word <- words if word.length > 3) yield word.toUpperCase
println(longWords) // 输出:List(APPLE, BANANA)
5. 迭代数组 / 列表:处理集合元素
val fruits = Array("apple", "banana", "cherry")
// 遍历数组并打印索引和元素
for (i <- fruits.indices) {
println(s"索引 $i: ${fruits(i)}")
}
// 同时遍历索引和元素(zipWithIndex)
for ((fruit, index) <- fruits.zipWithIndex) {
println(s"索引 $index: $fruit")
}
6. 多变量迭代:笛卡尔积
// 遍历两个范围的笛卡尔积
for (x <- 1 to 2; y <- List('a', 'b')) {
println(s"($x, $y)")
}
// 输出:
// (1, a)
// (1, b)
// (2, a)
// (2, b)
7. 复杂逻辑:计算 1-100 的偶数和
var sum = 0
for (i <- 1 to 100 if i % 2 == 0) {
sum += i
}
println(s"1-100偶数和:$sum") // 输出:2550
练习总结
to生成包含首尾的范围,until生成不包含尾的范围。- 用
if作为守卫条件筛选元素。 yield可将循环结果收集为新集合(类型与原集合一致)。- 支持多变量、嵌套循环和集合操作,语法简洁灵活。
可以尝试修改上述例子,比如实现素数筛选、字符串反转集合等,加深理解。