def 函數名(參數名 : 參數類型): 返回值類型 = { // 函數體 }
// 不聲明返回值類型的函數前提是右側函數體不包含遞歸的語句 def 函數名(參數名 : 參數類型) = { // 函數體 } // 又或者 def 函數名(參數名 : 參數類型): Unit = { // 函數體 }
def sayHello(firstName:String, middleName:String = "William", lastName:String = "Croft") : String = { firstName + " " + middleName + " " + lastName } // 若是給出的參數不夠,則會從左往右依次應用參數
sayHello("Mick", lastName = "Mike", middleName = "Jack") // 能夠混合使用未命名參數和帶名參數,可是未命名參數必須排在帶名參數前面
def sum(nums : Int*) = { var res = 0 for (num <- nums) res += num res }
// 冒號跟下劃線之間有空格 val s = sum(1 to 5 : _*)
def sum(nums : Int*):Int = { if(nums.length == 0) 0 else nums.head + sum(nums.tail : _*) }
若是函數體直接包裹在了花括號裏面,而沒有使用 = 鏈接,則函數的返回值類型就是 Unit 。這樣的函數就被稱之爲過程。過程一般用於不須要返回值的函數。編程
def sayHello(name: String) = "Hello, " + name def sayHello(name: String) { print("Hello, " + name); "Hello, " + name } // 過程還有一種寫法,就是將函數的返回值類型定義爲 Unit def sayHello(name: String) : Unit = "Hello, " + name
若是將一個變量聲明爲 lazy ,則只有在第一次使用該變量時,變量對應的表達式纔會發生計算。這種特性對於特別耗時的計算操做特別有用,好比打開文件進行磁盤 IO ,進行網絡 IO 等。網絡
import scala.io.Source._ // mkString表明將 BufferedSource 轉換成文本 lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
try { // 捕捉異常 throw new IllegalArgumentException("x should not be negative") } catch { // 出現異常以後該怎麼作 case _: IllegalArgumentException => println("Illegal Argument!") } finally { // 不管是否發生異常,都會進行的操做,一般用來釋放資源,關閉鏈接等 print("release resources!") } try { throw new IOException("user defined exception") } catch { // 根據不一樣的異常類別進行不一樣的處理 case e1: IllegalArgumentException => println("illegal argument") case e2: IOException => println("io exception") }
歡迎關注,本號將持續分享本人在編程路上的各類見聞。函數