Scala控制結構
阿新 • • 發佈:2018-12-25
package com.heres.scala /** * 1.Scala中基本控制結構,順序、條件、迴圈。這和其它的JVM語言是一致的,但是Scala也有些 * 高階的流程控制結構,例如:模式匹配; * 2.這這裡我們主要if 、for、while等三種控制結構及其企業級最佳實踐,並且在最後用Spark原始碼說明。 */ object Contros { def main(args: Array[String]): Unit = { println("Scala") /**if表示式 * 1.if else 表示式是有值的;這與java是不一樣的。 * 2.if表示式中可以進行型別推導,型別推導的一般過程就是根據變數的值的型別推導確定變數的型別, * 這在很多複雜演算法的實現的時候可以讓我們省略變數型別的書寫,為複雜演算法的實現提供了非常大的便利。 * 3.如果if後面沒有else部分,預設的實現是if(...) ... else () * * 下面的例子是擷取自Spark核心類SparkContext,在else部分雖然不返回有意義的結果,但是依舊沒有省略else * 而是使用了else{None}這種方式,其目的是為了確保if條件表示式的型別為處理邏輯需要的Option,而不是Any型別,為下一步處理打下基礎。 * if (isEventlong...) {Some(logger)} else {None} * 4.有多條語句,可以用{}包裹,{}最後一條是返回值 * 5.if表示式可以用在for迴圈等其他結構中,用於限制結果 */ //1 var age = 11 val result = if (age > 25) "worker" else "student"//此時因為“worker”和“student”都是字串,所以result也是字串型別 println(result) //2 val result1 = if (age > 25) "worker" else 1 //此時因為if表示式中的else兩側的內容一個是字串型別、另一個是整數型別,所有result1是兩者型別的公共父類any //3 val result2 = if (age > 25) "worker" else () //Unit型別 println(result2) var x,y = 0 val result3 = if(age <18){ x = x+1 y = y+1 x+y } else 0 println(result3) for(i <- 0 to 5 if i%2==0){ println("for迴圈列印"+i) } /** * for迴圈是不斷的迴圈一個集合,然後根據for迴圈的後面的{...}程式碼塊部分會根據for迴圈(...)裡面提取的集合item來作為{。。。}的輸入 * 進行流程控制 * 1.for迴圈中加入的if叫做條件守衛,用於限制for迴圈(優化for迴圈,去掉不必要的執行步驟,或者說用於跳出for迴圈) * 2.最後再次強調一下,在for迴圈中能夠提取出什麼內容取決於後面的集合的型別; * 3.想跳出for迴圈的話,除了加入if守衛以外,還可以使用return關鍵字 */ //1 var flag = true var sum = 0 for(i <- 0 to 6 if flag){ sum = sum +i if (5 == i) flag = false } println("sum = "+sum) //2 for(i <- "Hello spark".split(" ")) println(i) //3 sum = 0 for(i <- 0 to 6 ){ sum = sum +i // if (5 == i) return //return 返回的是方法級別的,這裡 } println("sum with return = "+sum) /** * while 迴圈也是迴圈集合來作為{...}的輸入,進而完成流程的控制,while迴圈在實際Server和Framework開發中至關重要, * 例如讓一個執行緒一直迴圈下去,一般都會使用while */ import scala.util.control.Breaks._ var n = true breakable{ while(n){ for(item <- "spark"){ println("while迴圈:"+item) if(item == 'r') { flag = false break } } } } println("while finished!!!") } }