Scala循环表达式

今天我们来看看Scala的循环表达式。

在很多场景中我们需要将同样的操作执行多次,而一般的顺序执行语句只能执行一次,这就需要使用循环结构来完成,大部分编程语言中都提供了三种主要的循环结构(for、while和do...while),Scala也不例外。

Scala循环表达式

如果你是一个Java工程师,相信你可以很轻易的写出循环表达式,且看Java中是如何实现循环的。

while循环的实现如下,当然Java5之后还有增强型for循环,这里不再赘述:

while(条件){
   
//可执行代码
}

 

for循环是这样写的:

for (初始化; 条件; 增加/递减) {
   
//可执行代码
}

 

do...while循环是这样写的:

do{
//可执行代码
}while(条件);

那么在Scala我们应该怎么实现它们呢?且看下文分解。


while循环

while语句中只要布尔表达式为true,循环体中的可执行代码就会一直重复执行下去。

语法:

while(条件){
   
//可执行代码
}
 

在循环体内,可执行代码是顺序执行的,这可以是单条语句,也可以是多条命令组成的代码块。

条件是一个布尔表达式,只要表达式的结果为true,循环就会不断执行下去,当条件为false的时候,则退出循环,执行后续的代码。

 

实例:

object WhileLoop extends App {
    var a =0; // 初始化
   
while (a <= 5) {// 条件
       
println(a)
       
a = a +1// 计数增加
   
}
}

 

执行结果:

0
1
2
3
4
5

在此,如果我们把条件改为 a <= -1,那么该循环一次都不会执行,也就是说当条件为false的时候,会直接跳过循环主体直接执行循环后续的代码。而如果我们条件始终为true那么它就是一个无限循环,永远也不会退出,除非程序异常或者我们强制关闭。

 

无限循环实例:

object WhileLoop extends App {
    var a =0; // 初始化
   
while (true) { // 条件
       
println(a)
       
a = a +1// 计数增加
   
}
}

 

执行结果:

……
20261
20262
20263
20264
20265
20266
20267
20268
20269
Process finished with exit code -1

 

do-while循环

do…while循环与while循环类似,不同之处在于do…while循环的布尔表达式是在执行一次之后做的判断,也就是说while循环中,如果条件为false,则无法进入循环体。但是do…while循环则不一样,它至少会执行一次。

 

语法:

do{
//可执行代码
}while(条件)

 

实例:

object DoWhileLoop extends App {
    var a =0; // 初始化
   
do {
        println(
a)
       
a = a +1// 计数增加
   
} while (a <= 5)// 条件
}

 

执行结果:

0
1
2
3
4
5

在此,如果我们把条件改为 a <= -1,则循环体仍然会被执行一次

a <= -1输出结果为:

0

 

同样的,如果我们将条件改为true那么它就是一个无限循环,永远也不会退出,除非程序异常或者我们强制关闭。

 

条件始终为true执行结果:

……
20261
20262
20263
20264
20265
20266
20267
20268
20269
Process finished with exit code -1

 

for循环

Scala提供的for循环功能十分强大简洁,虽然所有的循环结构都可以用while或者do…while 来实现,但是Scala的for循环功能不仅仅于此。

 

语法:

for( i <- range){
// 代码块
}

我们可以看到,这里的语法已经和Java语言的for循环有所不同了。range是一个区间,可以用to或者until来表示。箭头<- 表示向i赋值。

 

实例:

object ForLoop extends App {
    for (i <- 1to10) println(i)
}

 

输出结果:

1
2
3
4
5
6
7
8
9
10

 

for循环过滤

在for中添加条件表达式可以达到过滤的效果

 

语法:

for( i <- range condition1; condition1...){
// 代码块
}

 

实例:

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

 

输出结果:

6

for遍历集合

通过for可以遍历集合,这里类似于Java的增强for循环,语法如下:

语法:

for( i <- Collection){
// 代码块
}

 

实例:

object ForLoop extends App {
    val cities = List("NanJing", "SuZhou", "WuXi",
       
"TaiZhou", "XuZhou", "BeiJing")
   
for (city <- cities) println(city)
}

 

输出结果:

NanJing
SuZhou
WuXi
TaiZhou
XuZhou
BeiJing

Yielding

通过yield可以返回for循环过滤的结果

语法:

for( i <- Collection if condition...){
// 代码块
}

 

实例:

object ForLoop extends App {
        val beijing = for (city <- cities if city == "BeiJing") yield city
        println(
beijing)
}

 

输出结果:

List(BeiJing)

从输出我们也可以看到,返回的是一个集合类型的结果。