Scala語言規範----Array類

Array類
通用數組類定義以下。
final class Array[A](len: Int) extends Seq[A] {
def length: Int = len
def apply(i: Int): A = ...
def update(i: Int, x: A): Unit = ...
def elements: Iterator[A] = ...
def subArray(from: Int, end: Int): Array[A] = ...
def filter(p: A => Boolean): Array[A] = ...
def map[B](f: A => B): Array[B] = ...
def flatMap[B](f: A => Array[B]): Array[B] = ...
}
若是T不是類型參數或抽象類型,類型Array[T]表示宿主系統中的原生數組類型[]T。這種狀況下length返回數組的長度,apply表示下標,update表示元素更新。因爲apply和update操做(§6.25)的語法糖的存在,如下是Scala和Java/C#中對數組xs操做的對應:
Scala Java/C#
xs.length xs.length
xs(i) xs[i]
xs(i) = e xs[i] = e
標準引用類
數組也實現了序列特徵scala.Seq,定義了elements方法來返回一個包含數組中全部元素的Iterator
由於在Scala中參數化類型的數組和宿主語言中數組的實現仍是有差別的,在處理數組時須要注意一些細小的差異。解釋以下。
首先,不像Java或C#中的數組,Scala中的數組不是協變的;也就是說,在Scala中S<:T並不能得出Array[S] <: Array[T]。可是若是在宿主環境中能夠將S變爲T則能夠將S的數組變爲T的數組。
舉例來講Array[String]並不與Array[Object]一致,即便String與Object一致。然而能夠將類型爲Array[String]的表達式變爲Array[Object]。該轉變將會成功,不會拋出ClassCastException。例子以下:
val xs = new Array[String](2)
// val ys: Array[Object] = xs // **** 錯誤:不兼容的類型
val ys: Array[Object] = xs.asInstanceOf[Array[Object]] //OK
其次,對於有一個類型參數或抽象類型T做爲元素類型的多態數組,其表現形式不一樣於[]T。然而isInstanceOf和asInstanceOf仍像數組數組使用單態數組的標準表現形式那樣正常工做。
val ss = new Array[String](2)
def f[T](xs: Array[T]): Array[String] =
if(xs.isInstanceOf[Array[String]]) xs.asInstanceOf[Array[String]]
else throw new Error(「not an instance」)
f(ss) // 返回ss
多態數組的表現形式一樣保證了多態數組的建立與指望一致。如下是一個mkArray方法的例子,給定定義了元素且類型爲T的序列建立任意類型T的數組。
def mkArray[T](elems: Seq[T]): Array[T] = {
val result = new Array[T](elems.length)
val I = 0
for (elem <- elems) {
result(i) = elem
I += 1
}
}
注意在Java數組的類型擦除模型下,以上方法不能按照指望的方式工做-實際上它將老是返回一個Object數組。
再次,在Java環境中有一個方法System.arraycopy,有兩個對象爲參數,指定起始座標和長度,將元素從一個對象複製到另一個對象,這兩個對象的元素類型必須是兼容的。對於Scala的多態數組該方法不能正常工做,由於他們有不一樣的表現形式。做爲代替應當使用Array類的伴隨對象Array.copy方法。該伴隨對象也定義了不一樣的數組構造方法,還定義了提取方法unapplySeq(§8.1.7),提供了數組上的模式匹配。
package scala
Scala 標準庫
object Array {
/** 從‟src‟複製元素到‟dest‟ */
def copy(src: AnyRef, srcPos: Int, dest: AnyRef,
destPos: Int, length: Int): Unit = ...
/** 將參數中全部數組合併爲一個 */
def concat[T](xs: Array[T]*): Array[T] = ...
/** 建立一個連續的整數數組 */
def range(start: Int, end: Int): Array[Int] = ...
/** 用給定元素建立一個數組 */
def apply[A <: AnyRef](xs: A*): Array[A] = ...
/** 與上面相似 */
def apply(xs: Boolean*) : Array[Boolean] = ...
def apply(xs: Byte*) : Array[Byte] = ...
def apply(xs: Short*) : Array[Short] = ...
def apply(xs: Char*) : Array[Char] = ...
def apply(xs: Int*) : Array[Int] = ...
def apply(xs: Long*) : Array[Long] = ...
def apply(xs: Float*) : Array[Float] = ...
def apply(xs: Double*) : Array[Double] = ...
def apply(xs: Unit*) : Array[Unit] = ...
/** 建立一個數組,包含一個元素的多個拷貝 */
def make[A](n: Int, elem: A): Array[A] = ...
/** 提供數組上的模式匹配 */
def unapplySeq[A](x: Array[A]): Option[Seq[A]] = Some(x)
}
示例12.3.1 如下方法複製給定的數組參量並返回初始數組和複製的數組:
def duplicate[T](xs: Array[T]) = {
val ys = new Array[T](xs.length)
Array.copy(xs, 0, ys, 0, xs.length)
(xs, ys)
}

更多精彩內容請關注:http://bbs.superwu.cnjava

關注超人學院微信二維碼:數組

關注超人學院java免費學習交流羣:微信

 

相關文章
相關標籤/搜索