Smart's Blog

scala高级for循环和for推导式

序言:

       scala的for循环的除了基本形态以外还有一些高级特性,这是java和c++的for循环所没有的。

1、单个for循环内多个生成器

1
2
3
for (i <- 1 to 3; j <- 1 to 3;) {
println("i="+i + " " + "j="+j)
}

我们在for循环的条件内写了两个生成器,i <- 1 to 3和 j <- 1 to 3,这样其实就等价于一个嵌套循环,

1
2
3
4
5
for (i <- 1 to 3) {
for ( j <- 1 to 3;) {
println("i="+i + " " + "j="+j)
}
}

以下是执行结果:

1
2
3
4
5
6
7
8
9
i=1 j=1
i=1 j=2
i=1 j=3
i=2 j=1
i=2 j=2
i=2 j=3
i=3 j=1
i=3 j=2
i=3 j=3

2、循环条件内添加if语句作为守卫

1
2
3
for (i <- 1 to 3; j <- 1 to 3 if i!=j) {
println("i="+i + " " + "j="+j)
}

在循环条件内添加 i != j,这样只有在i != j的时候才会执行循环体内的语句。以下是执行结果:

1
2
3
4
5
6
i=1 j=2
i=1 j=3
i=2 j=1
i=2 j=3
i=3 j=1
i=3 j=2

可以看到i=j时的情况没有输出

3、for推导式(yield)

如果for循环的循环体以yield开始,则循环会构造出一个集合,每次循环生成集合中的一个值,

1
2
3
4
val num =
for (i <- 1 to 3; j <- 1 to 3)
yield i*j
println(num)

执行结果:

1
Vector(1, 2, 3, 2, 4, 6, 3, 6, 9)

4、循环条件内使用自定义变量

1
2
3
4
5
6
for(i <-1 to 3;num1 = i*10;num2=i*100;num3=i*1000){
print(i+"x10="+num1+" ")
print(i+"x100="+num2+" ")
print(i+"x1000="+num3+" ")
println()
}

我们在for循环条件内,定义了3个变量,分别为i的10倍、100倍和1000倍,然后在循环体内打印,打印结果如下:

1
2
3
1x10=10 1x100=100 1x1000=1000
2x10=20 2x100=200 2x1000=2000
3x10=30 3x100=300 3x1000=3000