条件控制的语法结构和java是一样的。但与java很大的区别在于,scala里的if/else语句是有返回值的。例如:
if(x > 0) x else 0
可赋值给变量,例如:
val a = if(x > 0) x else 0
返回的值也可以是混合型数据,例如:
val a = if(x > 0) 1 else "hello"//此处a是Any类型的数据
else部分也可以缺失,例如:
val a = if(x < 0) 1//这个表达式实际等同于val a = if(x < 0) 1 else ()
()表示Unit类,是无返回值的意思,类似java中void
块表达式中在java中也很常见,条件控制、循环迭代后面都跟着块表达式来处理逻辑动作,从上面的条件控制中就可以看出来java的块表达式是没有返回值的,而scala中块表达式是有值的,如果块表达式没有值,那么条件控制是有返回值的就说不通了。
val a = {var x = 1;println("x = " + x); x + 1} //先打印x=1,然后将x+1的值赋值给a
稍微变动一下:
val a = {var x = 1;println("x = " + x); x += 1}
后面改为x += 1 是x自加1操作,并没有返回值,所以返回的事一个Unit类型,块表达式的返回值完全取决于最后一个表达式
Scala中的while、do语句和java一样,有区别的是for语句,for循环语法如下:
for(i <- 表达式)
让变量i遍历<-右边全部的值,遍历数组通常是从0到n-1的区间,这时候需要使用until方法,until方法返回一个不包含上限的区间
Scala中没有提供break或continue关键字来跳出循环,scala控制循环有以下几个方法:
for循环中可以以”变量 <- 表达式”的形式提供多个循环的生成器,例如:
for(i <- 1 to 3; j <- 1 to 4) print(i+"-"+j+" ,")
根据结果可以看出,多个循环生成器从左至右依次,就是对应java中for循环的嵌套,向内部循环
Scala:for(生成器A;生成器B……)等同于
Java:for(生成器A){
for(生成器B){
……
}
}
每一个生成器都可以有一个守卫,用于循环时的判断,以if开头返回Boolean对象
for(i <- 1 to 3; j <- 1 to 4 if j != 2) print(i+"-"+j+" ,")//j不等于2的时候才打印
还可以再for循环生成器中引入在循环中使用的变量
for(i <- 1 to 3; jfrom = 3 - i; j <- jfrom to 4 ) print(i+"-"+j+" ,")
当i=1时,jfrom=2,此时j <- jfrom to 4 就是j <- 2 to 4
如果for循环的循环体的循环体以yield开始,循环体会构造一个集合,每次迭代的返回值都放入到这个集合中,例如:
for(i <- 1 to 3) yield i
返回的是scala.collectioin.immutable.IndexedSeq[Int]类型的集合。
当循环的是一个数组,例如
val arr = Array(1,2,3,4)
for(i <- arr) yield i
可以看到如果循环的事数组,返回的结果也是数组。由上可知使用yield操作时,yield结果集合类型与生成器中的(第一个)生成器类型相同。
for循环中生成器、守卫和定义太多时,写在一行代码可读性较差,可以将生成器、守卫和定义放在{}中,并换行不用在每行结尾写分号,例如:
for{i <- 1 to 3
jfrom = 3 - i
j <- jfrom to 4 } {
print(i+"-"+j+" ,")
}