Scala:for循环

大数据学习路线图

【版权声明】博客内容由厦门大学数据库实验室拥有版权,未经允许,请勿转载!
[返回Spark教程首页]

for循环

Scala中的for循环语句格式如下:

for (变量<-表达式) 语句块

其中,“变量<-表达式”被称为“生成器(generator)”。

下面给出一个实例:

for (i <- 1 to 5) println(i)

在上面语句中,i不需要提前进行变量声明,可以在for语句括号中的表达式中直接使用。语句中,“<-”表示,之前的i要遍历后面1到5的所有值。
语句执行结束后,会打印出下面结果:

1
2
3
4
5

当然,在前面的Range那一节,我们介绍了Range的使用方法,因此,这里可以改变步长,比如设置步长为2,如下所示:

for (i <- 1 to 5 by 2) println(i)

这样会得到下面结果:

1
3
5

但是,有时候,我们可能不希望打印出所有的结果,我们可能希望过滤出一些满足制定条件的结果,这个时候,就需要使用到称为“守卫(guard)”的表达式。比如,我们只希望输出1到5之中的所有偶数,可以采用以下语句:

for (i <- 1 to 5 if i%2==0) println(i)

这样,就只会得到下面的偶数结果:

2
4

Scala也支持“多个生成器”的情形,可以用分号把它们隔开,比如:

for (i <- 1 to 5; j <- 1 to 3) println(i*j)

运行上述代码后得到如下执行结果:

1
2
3
2
4
6
3
6
9
4
8
12
5
10
15

也可以给每个生成器都添加一个“守卫”,如下:

for (i <- 1 to 5 if i%2==0; j <- 1 to 3 if j!=i) println(i*j)

运行上述代码后得到如下执行结果:

2
6
4
8
12

for推导式

有时候,我们需要对上述过滤后的结果进行进一步的处理,这时,就可以采用yield关键字,对过滤后的结果构建一个集合。比如,我们可以采用以下语句:

scala> for (i <- 1 to 5 if i%2==0) yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)

上面的语句采用了黑色背景,表示这是在Scala解释器中的运行情况。
上面这种带有yield关键字的for循环,被称为“for推导式”。这个概念源自函数式编程,也就是说,通过for循环遍历一个或多个集合,对集合中的元素进行“推导”,从而计算得到新的集合,用于后续的其他处理。

子雨大数据之Spark入门
扫一扫访问本博客