数组Array
scala中实例化数组的方式如下
val greetStrings : Array[String] = new Array[String](3)
greetStrings(0) = "hello"
greetStrings(1) = ","
greetStrings(2) = "world!"
虽然val定义的是常量,也就是定义之后不能被重新赋值,greetStrings那个对象不能被重新赋值,他将永远指向初始化时指定的Array[String]
实例,但是变量指向的内部对象却仍可以改变,因此数组是可以改变的
如可以将第一个String
改为hi
greetStrings.update(0,"hi")
当然,上面的写法java气息是如此浓厚,也许应该让他有更简单的表现形式
val numsName = Array("zero","one","two")
列表List
scala.List不同于Java中的java.util.List,Scala中的List是不可变的。
这里的不可变指的是其所实例化的对象完全不可变,包括其中所包含的对象也无法修改。
val twoToThree = List(2,3)
// :: 操作符在这里的作用为向列表最前端插入整数 1
val oneToThree = 1 :: twoToThree
println(OnetoThree)
//结果如下
List(1,2,3)
上面似乎修改了列表,但实际上并没有。当List调用某些方法时,原List不变,只是在原List基础上,新生成了一个List对象,并赋值给oneToThree
List的常用方法如下
List()或Nil | 空List |
---|---|
List(“cool”,”tools”,”rule”) | 创建带有三个值”cool”,”tools”,”rule”的List[String] |
var thrill = “will” :: “fill” :: “until” :: Nil | 创建带有三个值的List[String],最后使用Nil 的理由:如果不是用 Nil ,那么最后就成了字符串until 调用 :: 方法,而对于String类型来说,是不存在该方法的 |
List(“a”,”b”) ::: List(“c”,”d”) | 用于叠加两个列表,返回新的List("a","b","c","d") |
thrill(2) | 返回列表索引为2的元素(基于0),until |
thrill.count(s => s.length == 4) | 返回长度为4的元素个数 |
thrill.drop(2) | 返回去掉前两个元素的List(“until”) |
thrill.dropRight(2) | 返回去掉后两个元素的列表List(“will”) |
thrill.exists( s => s == “until” ) | 判断是否有值为”until”的字符串在thrill中 |
thrill.filter(s => s.length == 4) | 返回长度为4的元素组成的新列表 |
thrill.foralll(s => s.endsWith(“l”) ) | 判断thrill所有元素,是否都以字符l 结尾 |
thrill.foreach(s => print(s))或thrill.foreach() | 对列表的每个元素执行print操作 |
thrill.head | 返回列表的第一个元素 |
thrill.init | 返回除最后一个元素之外的列表 |
thrill.isEmpty | 判断列表是否为空 |
thrill.last | 返回列表的最后一个元素 |
thrill.length | 返列表的长度 |
thrill.map(s => s + “y”) | 对每一个元素末尾加上y |
thrill.mkString(“,”) | 将每一个元素用, 连接组成字符串 |
thrill.remove(s => s.length == 4) | 移除列表中长度为4的元素 |
thrill.reverse | 返回逆序列表 |
thrill.sort((s,t) => s.charAt(0).toLowerCase < t.charAt(0).toLowerCase) | 返回按第一个字符排序的列表 |
thrill.tail | 返回列表中除第一个元素之外的列表 |
Tips在上面这些方法中,会发现有些方法不需要括号,而有些方法的调用则需要括号
从方法定义来看无若一个方法无需传参,定义时可以带括号也可以不带括号
class Hi{
def sayHi: Unit ={
println("hi")
}
def sayHello(): Unit = {
println("hello")
}
}
如上所示,sayHi方法定义时没有带括号,而sayHello方法定义则带有括号
val say:Hi = new Hi()
say.sayHi
say.sayHello
say.sayHello()
//结果如下
hi
hello
hello
实例化一个Hi类,调用时sayHi方法,不带括号是允许的,但是如果带上括号,编译时则会提示错误Unit does not take parameters
,而如果调用sayHello方法,带括号与不带括号均是允许的.
元组Tuple
与List相似,元组也是不可变的,但与List不同的是,元组可以包含不同类型的元素,而List只能包含一种类型的元素
元组实例化之后,可以基于索引直接访问其中的元素
val pair = (99,"Luftballons")
println(pair._1)
println(pair._2)
//结果如下
99
Luftballons
元组不能像List那样直接用索引访问,如pair(0)
访问是不允许的,因为列表的apply方法使用返回相同的类型,而元组中元素的类型不一定相同。
集合Set
Scala中的集合就是通常意义上的集合,无序,但是可被分为两类,可变集合和不可变集合,不可变与可变的区别则在于集合被改变时,是改变本身还是新生成一个集合。
映射Map
与以前所了解到的Map也基本一致,同样分为可变和不可变两类,键值对
对于任何对象,都可以调用->
方法,并返回包含见键值对的二元组
val tp = 1.->("test")
println(tp.getClass)
//结果如下
//class scala.Tuple2
此处调用Int类型的数值1的->
方法,参数为"test"
,返回元组给tp变量