预备知识(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)