Scala 學習(2)之「函數」

有返回值函數

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

若是將一個變量聲明爲 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")
}

在這裏插入圖片描述

歡迎關注,本號將持續分享本人在編程路上的各類見聞。函數

相關文章
相關標籤/搜索