Scala 【 4 參數、過程以及數組 Array 和 ArrayBuffer 】

變長參數

傳遞的參數是可以改變的。

例如:

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)

發佈了356 篇原創文章 · 獲贊 58 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章