1、lazy介绍
当val被声明lazy时,它的初始化将被推迟,直到我们首次对它取值。
例如:
lazy val words = scala.io.Source.fromFile(“C://Scala.txt”)
如果程序不访问words则文件永远也不会被打开,因此也不会被验证路径是否是正确的
因此在初始化话语句的时候并不会被报错.
lazy val file = scala.io.Source.fromFile(“E:\Scala.txt”)
//把文件里面的内容一行一行的读出来
for(line <- file.getLines())println(line)
2、可变参数用*来代替
参考代码:
def echo(args: String*)
{ for(arg <- args) println(arg)
}
可以用Array数组来传递参数
val arr = Array("Spark","Hadoop")
echo(arr: _*) --不能直接传arr,要用arr: _*来替代,下划线_为参数占位符
3、yield关键字,直译“产出”,将循环计算的结果加入到集合中
val aList = List(1,2,3,4,5)
val bList = List(2,3,4,5,6)
val result = for(a<-aList;b<-bList) yield {a+b}
yield里面还可以编写具体的代码块
4、数组
数组要点:
若长度固定则使用Array,若长度可能有变化则使用scala.collection.mutable.
ArrayBuffer
;提供初始值时可以不使用new;用()来访问元素;用for(elem<-arr)来遍历元素;用for(elem<-arr if...)...yield...来将符合的结果转型为新数组;Scala数组和Java数组可以互操作,用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数。
(1)定长数组声明:
val arr = Array[Int](1,2)
print(arr(0))//输出1,下标从0开始
val arrbuff = arr.toBuffer //将Array转换为数组缓冲
(2)可变数组声明:
import collection.mutable.ArrayBuffer
val arrbuff = ArrayBuffer
[Int]
()
arrbuff += 23
//用+=在尾端添加元素
arrbuff += (2,3,4,32)
//同时在尾端添加多个元素
arrbuff ++= Array(2,43,88,66)//可以用++=操作符追加任何集合
arrbuff.trimEnd(2)
//移除最后的2个元素
arrbuff.remove(2)
//移除arr(2+1)个元素
arrbuff.remove(2,4)
//从第三个元素开始移除4个元素
val arr = arrbuff.toArray
//将数组缓冲转换为Array
5、迭代映射
for((k,v)<-映射)处理k和v
如果你需要访问键或值,可以使用keySet和values方法,values返回一个Iterable
要反转一个映射-----即交换键和值的位置-----可以用:
for((k,v)<-映射)yield(v,k)
al scores = Map("Alice" -> 10, "Bob" -> 33) //构造一个不可变的Map[String,Int]
val scores2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 33) //构造一个可变的映射
val scores3 = new mutable.HashMap[String, Int] //构造一个空的映射,选定一个映射实现并给出类型参数
val scores4 = Map(("Alice", 10), ("Bob", 33)) //另外一种定义映射的方式
val bobScore = scores4("Bob") //类似于Java中的scores4.get("Bob");
val bobScore2 = scores4.getOrElse("Bob", 0) //如果映射包含键"Bob",返回对应的值;否则,返回0
//映射.get(key)这样的调用返回一个Option对象,要么是some(键对应的值),要么是None
//更新映射中的值
scores("Bob") = 90 //更新键"Bob"对应的值
scores("Fred") = 88 //增加新的键/值对偶到scores
scores +=("Bob" -> 20, "Fred" -> 30) //批量添加多个关系
scores -= "Alice" //移除Alice键对应的值
//如果对于不可变的映射,需要更改其值,那么可以使用如下方式
var newScores = scores +("Bob" -> 1, "Fred" -> 7) //返回更新过的新映射
newScores = scores - "Alice" //返回去掉Alice之后的新映射
6、元组
映射是键/值对偶的集合。对偶是元组(tuple)的最简单形态---元组是不同类型的值的聚集。如果你有元组,val t = (1,3.14,"fred"),那么可以使用val second = t._2来访问第二个元素,也就是3.14,注意元组的各元组从1开始,而不是0。
作业:移除一个数组中第一个负数后面的所有负数,返回结果
参考代码如下:
import scala.collection.mutable._
object ScalaFirst {
def main(args: Array[String]) {
val array = ArrayBuffer(-1, 2, 3, 4, -5, -6, -7, 9, 8, -10)
var flag = true
val result = for (i <- 0 until (array.length) if (flag || array(i) >= 0)) yield {
if (array(i) < 0) flag = false; array(i)
}
result.foreach(println)
}
}