Scala光速入门笔记及作业(一)

来源:互联网 发布:杜兰特各赛季数据统计 编辑:程序博客网 时间:2024/05/01 20:45

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)  }}

0 0