for 循环是Scala 一个非常强大的控制结构,不仅提供了迭代集合的能力,还提供过滤选项和生成新集合的能力。Scala 没有采用传统的for(初始化变量;判断条件;更新变量)这种语句结构,而是采用了for (变量 <-表达式)。<-用于遍历一个集合,变量<-表达式称为生成器表达式,它从集合中生成单个值。
遍历从1 到5 的集合,可以使用语句:
在for 循环的变量之前并没有定义变量i,但是却可以使用。Scala 默认i 的类型是集合元素类型,i 的作用域一直持续到循环结束,在这之后访问则提示变量i 未定义,如图7-9 所示:
图7-9 变量i 未定义
打印字符串所有元素,则可以通过如图7-10 方法完成:
图7-10 打印字符串
还可以使用间接调用,但是不常用,如图7-11 所示:
图7-11 间接调用打印字符串
一、for 循环的嵌套
可以在for循环括号里同时包含多组” 变量 <- 表达式 “结构,组之间用分号分隔,如图7-12 所示:
图7-12 for 循环嵌套
该写法等同下列语句,如图7-13 所示:
图7-13 for 循环嵌套(www.daowen.com)
二、for 语句和if 条件结合过滤部分循环
在for 循环中每个生成器都可以带if 判断来过滤想要的元素,此时的if 判断也被称为守卫。如图7-14 打印从1 到5 且不等于2 的元素值:
图7-14 带if 的for 循环
其中if 的判断条件并没有加小括号也不用在前面加分号,这在语法上是允许的。守卫跟在哪个生成器后面就对哪个生成器起作用,如图7-15 所示:
图7-15 带for 循环嵌套的if 判断
每个生成器可以带多个守卫,例如求1 到20 能同时被2 和3 整除的数,结果如图7-16 所示,其中两个守卫之间需要用分号分隔,但对于i 需要同时满足这两个条件方可。
图7-16 带多个if 的for 循环
三、for 推导式
如果for 循环以yield 开始,则该循环体会构造一个集合,每次迭代生成集合中的一个值,这类循环称作for 推导式。
如图7-17 所示,i 从集合分别取值1,3,5,7,9,然后对其*2+1 生成一个新的集合,用于后续的其他处理。
图7-17 for 推导式
Scala 并没有提供break 或continue 语句来退出循环,如果想要退出循环需要设置一布尔值变量控制。例如,打印从1 到10 的整数,但如果i 等于3 则退出,结果如图7-18 所示:
图7-18 for 循环退出
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。