今天我们来看看Scala的循环表达式。
在很多场景中我们需要将同样的操作执行多次,而一般的顺序执行语句只能执行一次,这就需要使用循环结构来完成,大部分编程语言中都提供了三种主要的循环结构(for、while和do...while),Scala也不例外。
如果你是一个Java工程师,相信你可以很轻易的写出循环表达式,且看Java中是如何实现循环的。
while循环的实现如下,当然Java5之后还有增强型for循环,这里不再赘述:
while(条件){
//可执行代码
}
for循环是这样写的:
for (初始化; 条件; 增加/递减) {
//可执行代码
}
do...while循环是这样写的:
do{
//可执行代码
}while(条件);
那么在Scala我们应该怎么实现它们呢?且看下文分解。
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循环与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
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( i <- range condition1; condition1...){
// 代码块
}
实例:
for (i <- 1 to 10 if i % 2==0 if i % 3==0) println(i)
输出结果:
6
通过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
通过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)
从输出我们也可以看到,返回的是一个集合类型的结果。