Scala的For、Function、Lazy、Exception

541732025發表於2015-11-09
for迴圈,不論在哪個語言裡面都是很基本的迴圈語句
for(i <- 1 to 2; j <- 1 to 2) print((100 * i + j) + "  ")

遍歷集合:
val files = (new java.io.File(".")).listFiles()
for(file <- files){
    println(file)
}

條件守衛:
for(i <- 1 to 2; j <- 1 to 2 if i != j) print((100 * i + j) + "  ")

函式的定義:
def  addA(x : Int) = x +100
def looper(x : Long, y : Long) : Long = {
    var a = x
    var b = y
    while(a != 0){
      val temp = a
      a = b % a
      b = temp
    }
    b //函式結果不需要return關鍵字
  } 
一般情況下,是不需要宣告返回值型別的,Scala很強大,能根據值進行型別推導。但是有個地方是特例,遞迴函式,必須指定返回值型別。
如果返回值為空,則使用Unit,如main:
def main(args: Array[String]): Unit = {}
或者乾脆省略掉:
def main(args: Array[String]){}
如果連引數都沒有,括號也可以省掉:
def current = age


匿名函式:
val  add = (x : Int) => x +200

遞迴函式:
def fac(n:Int):Int = if (n <= 0) 1 else n * fac(n - 1)//必須指定函式返回型別

引數預設值:
def combine(content:String, left: String = "[", right: String = "]") = left + content +right//函式引數可以指定預設值

可變引數
def connected(args: Int*) = {
      var result =0
      for(arg <- args) result += arg
       result //函式結果不需要return關鍵字
}
println("The result from a connected is : " + connected(1,2,3,4,5,6))

需要注意的是,由於在Scala中,object裡所有內容都是靜態的,所以,如果程式碼邏輯沒有封裝成函式,還是會執行的。封裝成函式後,不呼叫就不會執行。

Lazy延遲載入,只有第一次使用時才會初始化
lazy val file = Source.fromFile("E:\\scalain.txt")
for (line <- file.getLines) println(line)
假定檔案不存在,如果不加lazy,在第一句就會報錯;而加上lazy關鍵字之後,只有第一次使用的時候(file.getLines)才會報錯

異常處理:
    val n = 99
    try {
        val half = if (n % 2 == 0) n /2 else throw
            new RuntimeException("N must be event")
    }catch {
      case e : Exception => println("The exception is :" + e.getMessage()) //透過case匹配異常,只匹配一個。
    }finally{}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1826265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章