scala中的基本控制結構有順序、條件和循環三種方式,這個和其他的JVM語言是一致的,但是scala也有一些高級的流程控制結構類模擬匹配;在這裏我們主要說if、for 、while等三種控制結構及企業最佳實踐,並且在最後用spark源碼說明
if流程控制
- if條件表達式會根據if後面括號裏面的boolean值來決定整個if表達式的值
- 1.scala中if條件表達式是有值的,這個和java不一樣
- 2.if條件表達式中可以進行類型推到,實質上將,類型推到的一半過程,就是根據變量的類型來推到確定變量的類型,這在很多複雜算法
- 的實現的時候,可以讓我們省略掉變量的類型的書寫,爲複雜算法的實現提供了非常大的便利。
- 3.如果if後面沒有else部分,默認的實現是if(。。)。。。else()
- 下面的代碼節選自Spark的核心類SparkContext,在else部分雖然不返回有意義的結果,但是依舊沒有省略else,而是使用了else{none}這種結構
- 其目的是爲了確保if條件表達式的類型爲處理邏輯需要的Opation類型,而不是Any類型,爲下一部處理打下基礎。
- if(isEventLogEnable){some(logger)}else{None}
- 4.if表達式中如果有多條語句可以使用花括號包裹起來,但是這裏就有一個問題了,{}中的多條語句最後一條是計算結果。
- 5.補充說明{…}代表了一個語句塊,語句塊是有值的,值就是最後一條語句的結果,類型就是其類型
- 6.if表達式可以用在for循環等其他控制結構中用於限制結束
for循環
- for循環式不斷地循環一個集合,然後根據for循環後面的{…}代碼塊部分會根據for循環
- ()裏面提取的集合item來作爲{..}的輸入進行流程控制。
- for循環中加入的if叫做條件守衛,用於限制for循環(優化for循環,去掉不必要的執行步驟,或者說用於跳出for循環)
- 最後再次強調一下,在for循環中能夠提取出什麼內容取決於後面的集合的類型。
- 想跳出for循環的話,除了加入if守衛以外,還可以使用return關鍵字。
object ControlStructures {
def main(args: Array[String]): Unit = {
println("scala")
var age = 10
val result = if (age > 25) "Worker" else "Student"
println(result)
val result2 = if (age > 18) "Adult" else 1
var x, y = 0
val result4 = if (age < 18) {
x = x + 1;
y = y + 1;
x + y
} else 0
println(result4)
println("=======for部分代碼======")
for(i<-0 to 5 if i%2 == 0){
println(i)
}
var flag = true
var sum=0
println("sum="+sum)
for(item <- "Spark") print(item+",")
println()
for(item <- "Hello Spark".split(" ")) println(item)
sum=0
for(i<-0 to 5 ){
sum+=i;
if(sum>10) return
}
println(sum)
println("=======while部分代碼======")
}
}