设为首页 收藏本站
查看: 692|回复: 0

[经验分享] Scala语言规范----Array类

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-5-29 08:53:15 | 显示全部楼层 |阅读模式
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)
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-71715-1-1.html 上篇帖子: devicemapper的多路径 下篇帖子: storm源码分析---Transactional spouts
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表