變長參數
傳遞的參數是可以改變的。
例如:
def sum(nums:Int * ) = {
var result = 0
for(num <- nums){
result += num
}
result
}
result 是返回值
因爲是返回值,所以 在定義的時候別忘記有 = 。
如何傳遞 range 序列 ?
比如上面的傳遞 val s = sum(1 to 10) 這樣子是不對的,此時需要使用 scala 特殊的語法將參數定義爲序列,讓 scala 解釋器能夠識別。
形如這樣子:
val s = sum(1 to 10: _*)
遞歸函數實現累加
def sum(nums: Int*):Int = {
if(nums.length == 0) 0
else nums.head + sum(nums.tail: _*)
}
head 是取頭部第一個,後面的 nums.tail 相當於截取的子序列。
過程、lazy值和異常
過程:在 scala 中,定義函數時,如果函數體直接包括在花括號裏面,而沒有使用 = 連接,則函數的返回值類型就是 Unit 。這種的函數被稱爲過程。
過程通常用於不需要返回值的函數。
將函數的返回值類型定義爲 Unit 也算是過程。
比如:
def sayName(name:String){
print("Hi," + name);
"Hi " + name
}
或者
def sayName(name:String):Unit = "Hi," + name
lazy 值:如果將一個變量聲明爲 lazy ,則只有在第一次使用該變量時,變量對應的表達式纔會發生計算。
這種特性對於特別耗時的計算操作特別有用,比如打開文件進行讀寫,後者進行網絡 IO 。
定義的時候不會被進行計算,有點像操作系統中假分配,只有使用的時候纔會去進行計算,將結果返回。
即使定義的 lazy 值計算會出錯,但是隻是定義的話不會出錯,使用的纔會去驗證會不會出錯。
減少不必要的加載,真正使用的時候再調用。
異常:異常的處理和捕獲機制與 Java 相似。
try{
}catch{
}finally{
}
例子:
import java.io._
try {
throw new IOException("user defined exception")
}catch{
case e1:IllegalArgumentException => println("illegal argument")
case e2: IOException => println("io Exception")
}
數組操作的 Array、ArrayBuffer 以及遍歷
Array
在 scala 中的 Array 代表的含義與 Java 中類似,也是長度不可改變的數組。由於 Scala 與 Java 都是運行在 JVM 中,雙方可以互相調用,因此 Scala 數組的底層實際上是 Java 數組。 比如字符串數組在底層就是 Java 的 String[] ,整數數組在底層就是 Java 的 Int[] 。
數組初始化後,長度就固定下來,元素全部根據類型初始化。
val a = new Array[Int](10)
[ ] 裏面是泛型參數,指定類型。
默認是 0 。
創建 String 類型的默認是 null 。
直接用 Array() 創建數組,元素類型自動推斷。
val a = Array("hello","word")
ArrayBuffer
如果不預先導入包,那麼需要使用全限定名。
如果直接使用 ArrayBuffer ,則預先導入 ArrayBuffer 類。
import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]()
b += 1
b += (2,3,4)
使用 += 操作符,可以添加一個元素或者多個元素。
使用 ++= 操作符,可以添加其他集合中的所有元素。
使用 trimEnd() 函數,可以從尾部截斷指定個數的元素。
使用 insert() 函數可以在指定位置插入元素。
【需要移動指定位置後的所有元素,效率較低】
b.insert(1,2)
b.insert(1,6,7,8)
b.insert(1,2) 表示在 index = 1 的位置插入元素 2。
b.insert(1,6,7,8) 表示在 index = 1的位置插入元素 6, 7, 8 。
使用 remove() 函數可以移出指定位置的元素。
b.remove(1)
b.remove(1,3)
這裏和 insert 一樣理解。
Array 和 ArrayBuffer 可以互相轉換。
b.toArray
b.toBuffer
遍歷 Array 和 ArrayBuffer
使用 for 循環和 until 遍歷
for(i <- 0 until b.length) print(b(i))
// 跳躍遍歷,更改步長
for(i <- 0 until (b.length,2))print(b(i))
// 反向遍歷,從尾開始
for(i <- (0 until b.length).reverse)println(b(i))
//使用增強 for 循環
for(e <- b) println(e)