有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着执行第二个语句,以此类推。编程语言提供了更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或者语句块,下面是大多数编程语言中循环语句的执行流程图:
1.循环类型
Scala语言提供了以下几种循环类型:
- while循环:先判断循环条件,若为真,执行一遍循环代码块,然后再判断循环条件….直到循环条件为假,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。
- do-while循环:先执行一遍循环代码块,然后判断循环条件,若为真,继续执行一遍代码块,然后再判断循环条件….直到循环条件为假,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。
- for循环:需要指定循环计数器,在指定的范围内执行循环代码块,若计数器结束,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。
1.1 while循环
Scala语言中的while循环的格式如下:
while(condition)
{ statement(s);
}
其中,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为 true,当条件为 true 时执行循环体; 当条件为 false 时,退出循环,继续执行后续代码。
while循环的流程图如下所示:
注意:while 循环的特点是先判断循环条件,若条件直接为假,则循环体一次都不会被执行。
下面是一个while循环的例子:编辑Test1.scala文本文件,内容如下:
object Test1 {
def main(args:Array[String]) {
var a = 10;
while(a > 0){
println(a+" ");
a = a - 1;
}
println();
}
}
编译并执行Test1.scala文件,结果如下:
E:\Scala>scalac Test1.scala
E:\Scala>scala Test1
10 9 8 7 6 5 4 3 2 1
1.2 do-while循环
不像 while 循环在循环头部测试循环条件, do-while 循环是在循环的尾部检查它的条件。do-while 循环与 while 循环类似,但是 do-while 循环会确保至少执行一次循环。do-while循环的格式如下:
do {
statement(s);
} while( condition );
其中,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为 true,当条件为 true 时执行循环体; 当条件为 false 时,退出循环,继续执行后续代码。
do-while循环的流程图如下所示:
注意:do-while的条件表达式出现在循环的尾部,所以循环中的 statement(s) 至少会被执行一次。
下面是一个do-while循环的例子:编辑Test2.scala文本文件,内容如下:
object Test2 {
def main(args: Array[String]) {
var a = 10;
do{
print( a + " " );
a = a + 1;
}while(a < 20);
println();
}
}
编译并执行Test2.scala文件,结果如下:
E:\Scala>scalac Test2.scala
E:\Scala>scala Test2
10 11 12 13 14 15 16 17 18 19
1.3 for循环
for 循环允许编写一个执行指定次数的循环控制结构。格式如下:
for( var x <- Range ) { statement(s);
}
其中,Range 可以是一个数字区间表示 i to j ,或者 i until j。左箭头 <- 用于为变量 x 赋值。
举个例子:以下是一个使用了i to j语法(包括j)的for循环的实例:
object Test3 {
def main(args: Array[String]) {
var a = 0;
for( a <- 1 to 10) {
print(a + " ");
}
println();
}
}
编译并执行Test3.scala文件,结果如下:
E:\Scala>scalac Test3.scala
E:\Scala>scala Test3
1 2 3 4 5 6 7 8 9 10
以下是一个使用了i until j语法(不包括j)的for循环的实例:
object Test4 {
def main(args: Array[String]) {
var a = 0;
for( a <- 1 until 10) {
print(a + " ");
}
println();
}
}
编译并执行Test4.scala文件,结果如下:
E:\Scala>scalac Test4.scala
E:\Scala>scala Test4
1 2 3 4 5 6 7 8 9
在for循环中还可以使用分号[;]来设置多个区间,它将迭代给定区间内所有的可能值。以下实例演示了两个区间的for循环的实例:
object Test5 {
def main(args: Array[String]) {
var a = 0;
var b = 0;
for( a <- 1 to 3; b <- 4 to 7) {
println("a = " + a + ", b = " + b);
}
}
}
编译并执行Test5.scala文件,结果如下:
E:\Scala>scalac Test5.scala
E:\Scala>scala Test5
a = 1, b = 4
a = 1, b = 5
a = 1, b = 6
a = 1, b = 7
a = 2, b = 4
a = 2, b = 5
a = 2, b = 6
a = 2, b = 7
a = 3, b = 4
a = 3, b = 5
a = 3, b = 6
a = 3, b = 7
1.4 for循环集合
for循环集合的格式如下:
for( var x <- List ){
statement(s);
}
以上语法中, List 变量是一个集合,for 循环会迭代所有集合的元素。
举个例子:
以下实例将循环遍历数字集合。我们使用 List() 来创建集合。在以后章节我们会详细介绍集合。
object Test6 {
def main(args: Array[String]) {
var a = 0;
var numList = List(1,2,3,4,5,6);
for( a <- numList ) {
print(a + " ");
}
println();
}
}
编译并执行Test6.scala文件,结果如下:
E:\Scala>scalac Test6.scala
E:\Scala>scala Test6
1 2 3 4 5 6
1.5 for循环过滤
Scala 可以使用一个或多个 if 语句来过滤一些元素。以下是在 for 循环中使用过滤器的语法:
for( x <- List
if condition1; if condition2...
){
statement(s);
}
举个例子:以下是 for 循环中过滤的实例:
object Test7 {
def main(args: Array[String]) {
var a = 0;
var numList = List(1,2,3,4,5,6,7,8,9,10);
for( a <- numList
if a != 3; if a < 8
) {
print(a + " ");
}
println();
}
}
编译并执行Test7.scala文件,结果如下:
E:\Scala>scalac Test7.scala
E:\Scala>scala Test7
1 2 4 5 6 7
1.6 for使用yield
可以将 for 循环的返回值作为一个变量存储。语法格式如下:
var retVal = for { var x <- List
if condition1; if condition2...
} yield x
注意大括号中用于保存变量和条件,retVal 是变量, 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。
举个例子:以下实例演示了 for 循环中使用 yield:
object Test8 {
def main(args: Array[String]) {
var a = 0;
var numList = List(1,2,3,4,5,6,7,8,9,10);
var retVal = for { a <- numList
if a != 3; if a < 8
} yield a;
for ( b <- retVal ){
print(b + " ");
}
println();
}
}
编译并执行Test8.scala文件,结果如下:
E:\Scala>scalac Test8.scala
E:\Scala>scala Test8
1 2 4 5 6 7
2.循环控制语句
循环控制语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Scala 语言中默认是没有 break 语句,但是你在 Scala 2.8 版本后可以使用另外一种方式来实现 break 语句。当在循环中使用break 语句,在执行到该语句时,就会中断循环并执行循环体之后的代码块。Scala 中 break 的语法有点不大一样,格式如下:
// 导入以下包
import scala.util.control._ // 创建 Breaks 对象 val loop = new Breaks;
// 在 breakable 中循环 loop.breakable{
// 循环
for(...){
....
// 循环中断 loop.break;
}
}
下面是含有break语句的程序的流程图:
举个例子:以下是含有break语句的程序实例:
import scala.util.control._
object Test9 {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10);
val loop = new Breaks;
loop.breakable {
for( a <- numList ) {
print(a + " ");
if( a == 4 ) {
loop.break;
}
}
println();
}
}
}
编译并执行Test9.scala文件,结果如下:
E:\Scala>scalac Test9.scala
E:\Scala>scala Test9
1 2 3 4
以下实例演示了如何中断嵌套循环:
import scala.util.control._
object Test10 {
def main(args: Array[String]) {
var a = 0;
var b = 0;
val numList1 = List(1,2,3);
val numList2 = List(11,12,13);
val outer = new Breaks;
val inner = new Breaks;
outer.breakable {
for( a <- numList1 ) {
print("a = " + a);
inner.breakable {
for(b <- numList2) {
print("b = " + b);
if(b == 12){
inner.break;
}
}
}
}
}
}
}
编译并执行Test10.scala文件,结果如下:
E:\Scala>scalac Test10.scala
E:\Scala>scala Test10
a = 1
b = 11
b = 12
a = 2
b = 11
b = 12
a = 3
b = 11
b = 12
3.无限循环
如果条件永远为 true,则循环将变成无限循环(死循环)。我们可以使用 while 语句来演示无限循环:
object Test11 {
def main(args: Array[String]) {
var a = 1;
while( true ) { print( a + " ");
}
}
}
编译并执行Test11.scala文件,结果如下:
E:\Scala>scalac Test11.scala
E:\Scala>scala Test11
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 终止批处理操作吗(Y/N)? y
E:\Scala>
以上代码执行后循环会永久执行下去,可以使用 Ctrl + C 键来中断无限循环。