1. 程式人生 > >Scala控制結構

Scala控制結構

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!!!")
  }
}