1.Scala的程序控制结构同其他语言一样包括顺序、选择和循环结构。后两种结构分别对应Scala中的if选择语句,while、do while和for循环语句。
2.if选择语句包括if…else…、if…else if…else、if嵌套语句,使用方法同java等高级程序设计语言相同。与其他高级语言不同的一点就是Scala中的if语句可以作为表达式使用,如果其具有返回值,那可以将返回值直接赋值给变量。
scala>val x = if("hello"=="hell") 1 else 0
x: Int = 0
scala>val x = if("hello"=="hell") println("1") else println("0")
x: Unit = ()
3.Scala不推荐使用while循环,而是推崇使用for循环来代替while循环,while循环语句也可以作为一个表达式,但是它与if语句作为表达式时有一个区别,即while循环语句作为表达式时返回值的类型只能是Unit。这是因为函数式语言喜欢使用val类型的变量,但while循环需要与var类型的变量一起使用,所以从严格意义上讲,scala并不是纯函数式编程语言(如果不明白val和var类型变量的区别可移步至博主的《Scala入门随笔一》)
4.Scala中的for循环与其他高级程序设计语言不同,区别:
//其他程序设计语言的for循环语句格式
for(初始化变量;条件判断;更新变量){}
//scala中for循环语句格式
for(变量<-更新变量的集合){}
在scala的for循环语句中“<-“符号叫做生成器(generator),并且for循环语句是通过遍历集合达到循环效果。
for(i<- 1 to 5){
println("i="+i)
}
//结果
i=1
i=2
i=3
i=4
i=5
这里的to实际上是RichInt类型中的to方法,1 to 5在执行时会将Int类型隐式转换成scala.runtime.RichInt类型。然后去调用1.to(5)。to方法在scala中的定义:
def to(end: Int): Range.Inclusive = Range.inclusive(self,end)
循环的时候就会将scala.collection.immutable.Range.Inclusive集合中的每个元素赋值给变量i,达到循环效果。除了to方法还有until方法可以使用,它和to方法的区别在于1 to 5的结果是[1,5](1到5的闭区间:1,2,3,4,5)而1 until 5的结果是[1,5)(1到5的左闭右开区间:1,2,3,4)。当然,还可以有1 to (10,2),1 until (10,2)这种形式,括号里面的2是设定的步长。
def until(end: Int, step: Int): Range = Range(self,end,step)
def to(end: Int, step: Int): Range.inclusive = Range.inclusive(self,end,step)
for循环还可以添加过滤条件,语法格式:
for(x <- 表达式 if 条件判断1; if 条件判断2...){
//满足所有条件判断时执行循环中的语句;
}
栗子
scala>for(i<- 1 to 40 if(i%4==0);if(i%5==0)){
println("i="+i)
}
//结果
i=20
i=40
此外for循环可以和yield关键字一起使用作为表达式,这样的表达式具有返回值。下面栗子:
scala>var x = for(i<- 1 to 5) yield i
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1,2,3,4,5)
yield会将每循环一次生成的值保存在缓存中,循环结束后它会将所有的值生成一个集合返回。yield后面除了变量还可以跟表达式。下面栗子:
scala> var x=for(i<-1 to 5) yield i/2
x: scala.collection.immutable.IndexedSeq[Int] = Vector(0,1,1,2,2)
5.Scala里面没有像其他高级程序设计语言一样提供break、continue关键字。如果在while或者是for循环中冒然使用这两个关键字会报错的。但是如果需要使用break语句的功能可以由两种替代办法来实现:
一、定义Boolean类型的变量,在for或while循环中进行条件判断;
二、在程序中引入scala.util.control.Breaks类,然后调用Breaks类中定义的breakable方法。
//引入Breaks类及其所有方法的语句
import scala.util.control.Breaks._
//调用Breaks中定义的breakable方法
breakable{
//for循环语句,可在其中使用break关键字,break为Breaks中定义的方法
}
Breaks类中breakable方法的定义如下:
def breakable(op: => Unit){
try{
op
}catch{
case ex: BreakControl =>
if(ex ne breakException) throw ex
}
}
Breaks类中break方法定义如下:
def break(): Nothing = { throw breakException }