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.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

时间: 2024-11-18 09:10:06

Scala语言规范----Array类的相关文章

C#6.0语言规范(十) 类

类是可以包含数据成员(常量和字段),函数成员(方法,属性,事件,索引器,运算符,实例构造函数,析构函数和静态构造函数)和嵌套类型的数据结构.类类型支持继承,这是一种派生类可以扩展和专门化基类的机制. 类声明 一个class_declaration是type_declaration(类型声明,声明一个新的类). 1 class_declaration 2 : attributes? class_modifier* 'partial'? 'class' identifier type_paramet

Spark 大数据中文分词统计(三) Scala语言实现分词统计

Java版的Spark大数据中文分词统计程序完成之后,又经过一周的努力,把Scala版的Spark 大数据中文分词统计程序也搞出来了,在此分享给各位想学习Spark的朋友. 如下是程序最终运行的界面截图,和Java版差别不大: 如下是Scala工程结构: 当你在工程主类文件WordCounter.scala上单击右键,选择Run As Scala Application: 然后选择唐诗宋词进行分词统计,就会出现前面显示的分词结果. 工程代码已经上传CSDN:http://download.csd

C# 语言规范_版本5.0 (第0章 目录)

C# 语言规范 版本5.0 注意 © 1999-2012 Microsoft Corporation.保留所有权利. Microsoft.Windows.Visual Basic.Visual C# 和 Visual C++ 是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标. 本文提及的其他产品和公司名称可能是其各自所有者的商标. 目录 1. 介绍......................................................

新书:Scala语言基础与开发实战

大数据科学丛书系列的最新一本<Scala语言基础与开发实战>即将面市,预计月底上架.内容还是不错的,文笔简介,内容实用,值得学.用. 大数据资深培训师王家林新作. 详细介绍大数据开发语言Scala及其在分布式框架Akka和Kafka中的应用. 秉承"实战"类图书特点,解析大量代码的编写操作,具有较强的可操作性,便于读者学习和理解. 算上再过几个月出版的<Spark内核解析及性能调优>,一年时间,大数据科学丛书系列之Spark的小套系基本形成了:从学习Spark的

Java语言规范

Java基础技术细节总结 - 语言规范 Java Java 基础 开发莫忘基础,写业务写多了很多基础内容容易忘.这里将寻根溯源,总结Java语言规范和基础类中的一些细节问题.所有关于Java语言规范的细节问题,都可以参考 The Java? Language Specification, Java SE 8 Edition(JLS8) . 本文将不断补充.. 小数化为整数 Math.floor(x)返回小于等于x的最接近整数,返回类型为double; Math.round(x)相当于四舍五入,返

Chisel3 - Scala语言专家

https://mp.weixin.qq.com/s/j8mt_qvwliKIKtlN6JcyqQ 介绍Intellij IDEA安装Scala插件后,如何在阅读和编码两方面助益开发者. 1. 语言专家 Scala是一门多范式编程语言,在支持面向对象编程的同时,也支持函数式语法.再加上隐式规则和宏等特性,以及众多的语法糖.使得Scala的学习曲线异常陡峭. 除了语言规范.教程图书.网络资料之外,一个强大的能够智能提示补全.时时检查提醒的编辑器或者IDE,可以极大的提高学习速度和编码效率. 事实上

Scala基础:面向对象&mdash;&mdash;类

类 (class) 类是对象的模板,通过构造类,能够使用new关键字声明一系列同结构的对象. Scala的一个源文件可以包含多个public类. 声明Person类: class Person{   var name : String = _   val age = 10   private[this] val gender = "male" } 说明: name字段被赋值为"_""_"即占位符.表示name被声明为String.但赋值为&quo

scala 第7讲 类的属性和对象的私有字段

温故而知新 之scala第7讲类的属性和对象私有字段百度云盘连接http://yun.baidu.com/share/home?uk=4013289088#category/type=0class Person { private var age = 0 def increment(){age += 1} def current = age } class Student{ private var privateAge = 0 val name = "Scala" def age =

Scala语言初识

scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让现在大量掌握java的编程者的智力投资得到极大的利用.并且还借鉴了Elang函数语言及Ruby等脚本语言,从而有高效,轻便等特性,从而原来掌握Ruby,Erlang等语言者,来学习scala时感到亲切从而更加快捷掌握. scala由洛桑联邦理工学院的Martin Odersky设计,第一个版本发布于