定长数组
|
// 10个整数的数组,所有元素初始化为0
valnums=newArray[Int](10)
// 长度为2的数组,类型是推断出来的
// 提供初始值时不需要使用new
vals=Array("Hello","World")
// 访问元素
// 虽然s是val的,但是其中的内容还是可以变的
s(0)="GoodBye"
|
在JVM中,Scala的数组是用Java的数组一样的方式实现的。
变长数组
对应于Java的ArrayList,Scala中可变长度的数组使用的是ArrayBuffer。
|
importscala.collection.mutable.ArrayBuffer
valb=ArrayBuffer[Int]()
// 也可以是 val b = new ArrayBuffer[Int]
// 在尾端添加元素
b+=1
b+=(1,2,3,5)
// 追加一个集合
b++=Array(8,13,21)
|
其他的还是看API吧。
在ArrayBuffer尾端添加或者移除元素是高效的,但其他位置不是,所以尽可能将操作放在尾端进行。
还有Array和ArrayBuffer间的转换: b.toArray和 a.toBuffer。
遍历
前面见过的for表达式还是可用的。这里再提一点更多的。
|
// 每两个元素一跳
for(i<-0until(a.length,2))
// 反序遍历
for(i<-0untila.length reverse)
// 不使用下标时
for(elem<-a)
|
数组转换
通过for推导式,可以便捷生成一个新的数组。
|
for(elem<-aifelem%2==0)yield2*elem
|
还有一种方式,对于习惯函数式编程的人来说更加熟悉:
|
a.filter(_*2==0).map(2*_)
|
这里的操作都没有改变原数组,而是生成了一个新的数组。因为Scala结合了函数式编程范式,而函数式是比较排斥函数和方法的副作用的。
常用算法
|
valb=ArrayBuffer(1,7,2,9)
// 排序,不改变原来的数组,而是生成了一个新的数组
valbSorted=b.sorted(_<_)
|
多维数组
多维数组就是数组的数组,Scala中二维数组看起来就是 Array[Array[Double]]。
要构建多维数组,使用 ofDim方法。
|
// 三行四列的数组
valmatrix=Array.ofDim[Double](3,4)
// 访问多维数组
maxtrix(row)(column)=42
// 可以创建每行长度不一样的数组
valtriangle=newArray[Array[Int]](10)
for(i<-0until triangle.length)
triangle(i)=newArray[Int](i+1)
|
与Java的互操作
引入scala.collection.JavaConversions包内的隐式转换方法,就可以在代码中自动包装Scala内的数组和Java里的List等。
|
importscala.collection.JavaConversions.bufferAsJavaList
importscala.collection.mutable.ArrayBuffer
valcommand=ArrayBuffer("ls","-al","/home/zheng")
valpb=newProcessBuilder(command) // 这里自动包装了
|
从Java数组类到Scala数组也是差不多的。
http://nerd-is.in/2013-08/scala-learning-working-with-array/
分享到:
相关推荐
在Scala中,方法和函数几乎可以等同(比如它们的定义、使用、运行机制都是一样的),只是函数的使用方式更加的灵活多样。函数式编程是从编程方式(范式)的角度来谈的,可以这样理解:函数式编程把函数当作一等公民,...
Scala是一门以Java虚拟机(JVM)为运行环境并***将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言***。Scala源代码(.scala)会被编译成Java字节码(.class),然后运行在JVM上,并可以调用现有的Java...
def main(args: Array[String]): Unit = { val list = List(1, 2, 5) println(list) val pig = new Pig(狗蛋) //使用apply方法来创建对象 val pig2 = Pig(铁蛋) //自动 apply(pName: String) val pig3 = Pig...
面向对象来看,接口并不属于面向对象的范畴,Scala是纯面向对象的语言,在Scala中,没有接口。Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)...
def main(args: Array[String]): Unit = { //编写一个隐式函数转成 Double->Int 转换 //隐式函数应当在作用域才能生效 implicit def f1(d: Double): Int = { //底层 生成 f1$1 d.toInt } implicit def f2(f: ...
1.表达式: A.条件表达式 val x = 3 val y = if(x > 1) 1 else -1 B....支持返回多种类型(前提是在不确定类型的情况下,val y:String或val y:Int这样都不行)。 val y = if(x > 1) 1 else hello ...
IDEA集成scala(csdn)————程序
scala连接redis哨兵模式 demo 使用scala的redis库(csdn)————程序
项目概述:邮电学院Scala大数据实时处理——基于Lambda架构的Spark源码实践 本项目为邮电学院假期师资培训的成果,主要采用Scala语言开发,围绕Lambda架构构建了一套实时数据流处理系统。项目包含35个文件,其中...
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于...
大数据全栈开发工程师视频教程全集,本课程将近2000课时,从Java——数据库——Hadoop——scala——spark——hive——storm——kylin——pyspark——python——大数据面试
——Martin Odersky, Scala的作者 “Scala和Java8开发者的函数式编程指南!” ——William E. Wheeler, TekSystems “本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。” ——...