Scala入门随笔二

来源:互联网 发布:apple mac book pro 编辑:程序博客网 时间:2024/05/18 09:42

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 0x: Int = 0scala>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=1i=2i=3i=4i=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=20i=40

此外for循环可以和yield关键字一起使用作为表达式,这样的表达式具有返回值。下面栗子:

scala>var x = for(i<- 1 to 5) yield ix: scala.collection.immutable.IndexedSeq[Int] = Vector(1,2,3,4,5) 

yield会将每循环一次生成的值保存在缓存中,循环结束后它会将所有的值生成一个集合返回。yield后面除了变量还可以跟表达式。下面栗子:

scala> var x=for(i<-1 to 5) yield i/2x: 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 }
0 0
原创粉丝点击