一、 if else表達式
scala中沒有三目運算符,因為根本不需要。scala中if else表達式是有返回值的,如果if或者else返回的類型不一樣,就返回Any類型(所有類型的公共超類型)。
例如:if else返回類型一樣
scala> val a3 = 10| val a4 =| if(a3 > 20){| "a3大于20"| }else{| "a3小于20"| }| println(a4)
a3小于20
val a3: Int = 10
val a4: String = a3小于20
例如:if else返回類型不一樣
scala> val a5 =| if(a3 > 20){| "a3大于20"| }| println(a5)
()
val a5: Any = ()
如果缺少一個判斷,什么都沒有返回,但是Scala認為任何表達式都會有值,對于空值,使用Unit類,寫做(),叫做無用占位符,相當于java中的void。
注意:行尾的位置不需要分號,只要能夠從上下文判斷出語句的終止即可。但是如果在單行中寫多個語句,則需要分號分割。在Scala中,{}快包含一系列表達式,其結果也是一個表達式。塊中最后一個表達式的值就是塊的值。
二、while表達式
Scala提供和Java一樣的while和do循環,與If語句不同,While語句本身沒有值,即整個While語句的結果是Unit類型的()。
- while循環
scala> var n = 1;| val while1 = while(n <= 10){| n += 1| }| println(while1)| println(n)
()
11
var n: Int = 11
val while1: Unit = ()
- while循環的中斷
scala> import scala.util.control.Breaks| val loop = new Breaks| loop.breakable{| while(n <= 20){| n += 1;| if(n == 18){| loop.break()| }| }| }| println(n)
18
import scala.util.control.Breaks
val loop: scala.util.control.Breaks = scala.util.control.Breaks@6ce9771c
注意:scala并沒有提供break和continue語句來退出循環,如果需要break,可以通過幾種方法來做1、使用Boolean型的控制變量 2、使用嵌套函數,從函數中return 3、使用Breaks對象的break方法。
三、 for表達式
Scala 也為for 循環這一常見的控制結構提供了非常多的特性,這些for 循環的特性被稱為for 推導式(for comprehension)或for 表達式(for expression)。
1) for示例1:to左右兩邊為前閉后閉的訪問
scala> for(i <- 1 to 3; j <- 1 to 3){| print(i * j + " ")| }| println()
1 2 3 2 4 6 3 6 9
2) for示例2:until左右兩邊為前閉后開的訪問
scala> for(i <- 1 until 3; j <- 1 until 3) {| print(i * j + " ")| }| println()
1 2 2 4
3) for示例3:引入保護式(也稱條件判斷式)該語句只打印1 3。保護式滿足為true則進入循環內部,滿足為false則跳過,類似于continue
scala> for(i <- 1 to 3 if i != 2) {| print(i + " ")| }| println()
1 3
4) for示例4:引入變量
scala> for(i <- 1 to 3; j = 4 - i) {| print(j + " ")| }| println()
3 2 1
5) for示例5:將遍歷過程中處理的結果返回到一個,使用yield關鍵字
scala> val for5 = for(i <- 1 to 10) yield i| println(for5)
Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val for5: IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
6) for示例6:使用花括號{}代替小括號()
scala> for{| i <- 1 to 3| j = 4 - i}| print(i * j + " ")| println()
3 4 3
注意:{}和()對于for表達式來說都可以。for 推導式有一個不成文的約定:當for 推導式僅包含單一表達式時使用原括號,當其包含多個表達式時使用大括號。值得注意的是,使用原括號時,早前版本的Scala 要求表達式之間必須使用分號。