Scala學習筆記(4)-函數式風格

識別指令式和函數式風格有一個小技巧就是,若是代碼包含了任何var變量,那它大概就是指令式的風格。若是代碼根本就沒有var——就是說僅僅包含val——那它大概是函數式的風格。所以向函數式風格推動的一個方式,就是嘗試不用任何var編程,Scala鼓勵你使用val進行函數式編碼。編程

先來看一個指令式風格的: 函數

def printArgs(args: Array[String]): Unit = {
    var i = 0
    while (i < args.length) {
         println(args(i)) i += 1
    } 
}

你能夠經過去掉var的辦法把這個代碼變得更函數式風格,例如,像這樣:編碼

def printArgs(args: Array[String]): Unit = {
    for (arg <- args) println(arg)
}

或這樣:spa

def printArgs(args: Array[String]): Unit = { 
    args.foreach(println)
}

從上面的代碼能夠看到函數式風格的代碼更簡潔、更易讀、更少犯錯。scala

可是上面的printArgs並非純函數式的,由於它有反作用,其反作用是打印到標準輸出流。函數有反作用的馬腳就是結果類型爲Unit。若是某個函數不返回任何有用的值,就是說其結果類型爲Unit,那麼那個函數惟一能讓世界有點兒變化的辦法就是經過某種反作用。code

更函數式的風格應該是:orm

def formatArgs(args: Array[String]) = args.mkString("\n")//沒有反作用,返回值打印交由println處理
println(formatArgs(args))//照上面所說println函數是有反作用的<span></span>

牢記:無論是var仍是反作用都不是天生邪惡的。Scala不是強迫你用函數式風格編任何東西的純函數式語言。它是一種指令式/函數式混合的語言。你或許發如今某些狀況下指令式風格更符合你手中的問題,在這時候你不該該對使用它猶豫不決。對象

崇尚val,不可變對象和沒有反作用的方法,只有在特定須要和判斷以後才選擇var,可變對象和有反作用的方法。ci

相關文章
相關標籤/搜索