scala开发快速入门 | 第三篇 程序控制结构

预备知识(Range)

在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。

在创建Range时,需要给出区间的起点和终点以及步长(默认步长为1)。

(1)创建一个从1到5的数值序列,包含区间终点5,步长为1

scala> 1 to 5

res2: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

scala> 1.to(5)

res3: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1

scala> 1 until 5

res7: scala.collection.immutable.Range = Range(1, 2, 3, 4)

(3)创建一个从1到10的数值序列,包含区间终点10,步长为2

scala> 1 to 10 by 2
res8: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
scala> 1  to (10,2)

res9: scala.collection.immutable.Range.Inclusive = Range(1, 3, 5, 7, 9)

(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.3f

scala> 0.5f to 5.9f by 0.8f
res10: scala.collection.immutable.NumericRange[Float] = NumericRange(0.5, 1.3, 2.1, 2.8999999, 3.6999
998, 4.5, 5.3)
scala> 0.5f to(5.9f, 0.8f)
res11: scala.collection.immutable.NumericRange.Inclusive[Float] = NumericRange(0.5, 1.3, 2.1, 2.89999

99, 3.6999998, 4.5, 5.3)

一、if语句

1)if语句

if(true){

//条件为真时执行

}

示例

scala> val x=8
x: Int = 8
scala> if (x<10) println(s"$x is smaller than 10")

8 is smaller than 10

2)if...else...语句

if(条件判断){

//条件判断为真的时候执行

}else{

//条件判断为假时执行

}

示例:

scala> val x=9
x: Int = 9
scala> if(x<8) println("small") else println("big")

big

3)if...else if ...else...语句

if(条件判断语句1){

//条件判断语句1为真的时候执行

}else if(条件判断语句2){

//条件判断语句2为真的时候执行

}else if(条件判断语句3){

//条件判断语句3为真的时候执行

}else{

//上面的条件判断语句都为假的时候执行

}

4)if的嵌套使用

if(条件判断语句1){

    if(条件判断语句2){

    //条件判断语句2为真的时候执行

   }else{

   //条件判断语句2为假的时候执行

  }

}else{

//条件判断语句为假的时候执行

}

5)if表达式

Scala的if语句可以作为表达式使用,表达式的返回值可以直接赋值给变量。

scala> val x=if ("hello"=="hell") 1 else 0

x: Int = 0

Note:如果 if else语句缺省了else 语句块,那么默认是没有返回值 Unit 用()表示类似于java的void

二、while循环语句

Scala中也提供了while循环语句,不过scala弱化了while语句的循环功能,在程序的设计中不推荐使用while,尽量的使用for循环或者递归来替代while循环语句。

1)while的使用

while(条件判断){

//条件判断为真的时候执行

2)do while的使用

do{

//先执行,再进行条件的判断,如果为真继续执行

}while(条件判断)

与if不同的是:while和do... while()也有返回值,只不过其返回值都为Unit。

var i=15

var x=while(i<20){

println(i)

i+=1

}

15
16
17
18
19
x: Unit = ()

三、for循环语句

1)Scala有自己的循环风格,语法格式如下:

for(i <- 表达式){

//执行循环中的语句

}

for(i<- 1 to 5){

println("i="+i)

}

运行结果:

1

2

3

4

5

<-  符号被称为生成器,for循环实际上是对集合的遍历来达到循环的目的的,它首先执行 1 to 5 ,相当于调用1.to(5),但是我们知道,整型没有to方法,此时它会将Int类型隐式的转换为scala.runtime.RichInt类型,然后再去调用RichInt的to方法。

1 to 5 生成的集合包含5个元素,即:元素的范围是[1,5],如果希望是右开的则可以使用 1 until 5 即 元素的范围是  [1,5)

scala> 1 until 5
res8: scala.collection.immutable.Range = Range(1, 2, 3, 4)

2)在循环的时候 to 、until方法都可以设置步长。

scala> for(i<- 1 until(10,2)) println("i="+i)
i=1
i=3
i=5
i=7
i=9

scala> for(i<- 1 to(10,2)) println("i="+i)
i=1
i=3
i=5
i=7
i=9

3)无论是for循环还是while循环,scala中都没有提供java语言中的break、continue关键字。

但是我们可以通过两种途径实现 

一是定义Boolean类型的变量,在for或者while循环中进行条件的判断 ;下节介绍。

二是在程序中引入scala.until.control.Breaks类。

//引入Breaks类及所有的方法

import scala.util.control.Breaks._

//调用Breaks中定义的breakable方法

breakable{

    for(i<- 1 to 5){

    if(i>2) break

    println("i="+i)

}

}

运行结果:

i=1 

i=2

4)有过滤条件的for循环

可以使用有过滤条件的for循环退出for循环

for(x <- 表达式 if条件判断1;if条件判断2...){

//所有条件判断都满足时才执行循环的语句

}

示例代码:

for(i<- 1 to 5 if(i<3)){

println("i="+i)

}

i=1

i=2

5)多重for循环

语法格式:

for(x<- 表达式 if 条件判断1;if条件判断2...){

    for(x<- 表达式 if 条件判断1;if条件判断2...){

    //所有的条件都满足的时候才执行循环中的语句

}

}

示例代码:

for(i<- 1to 5 if(i>3)){

    for (j<- 5 to 7 if(j==6)){

    println("i="+i+",j="+j)

}

}

i=4,j=6

i=5,j=6

6)作为表达式的for循环 

for循环同关键字yield一起使用可作为表达式,循环执行完后有返回值。

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

for循环每执行一次,yield就会生成对应的值保存在缓存中,当循环执行完后,它会利用前面循环中的得到的值生成一个集合并返回。关键字后面还可以跟表达式。

scala>  val x= for(i<- 1 to 5) yield i%2==0
x: scala.collection.immutable.IndexedSeq[Boolean] = Vector(false, true, false, true, false)

scala>  val x= for(i<- 1 to 5) yield i/2
x: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 1, 2, 2)



猜你喜欢

转载自blog.csdn.net/yangshaojun1992/article/details/80544049
今日推荐