一、课程前导
DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习。
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
Scala是最为重要的大数据语言,该视频每天还在持续跟新中,预计大约有140讲,请您根据上述视频彻底掌握Scala实战技术。
51cto:http://edu.51cto.com/lesson/id-66496.html
酷6网:http://v.ku6.com/show/-MZOplGh9yLx-TwnUEdidA...html
56我乐:http://www.56.com/u74/v_MTM4MTEzNTk5.html
最后,王家林老师个人的微信是18610086859
二、课程内容
注:以下笔记来自王家林老师的第3讲:Tuple、Array、Map与文件操作入门实战视频和《快速Scala》书。
第3讲:Tuple、Array、Map与文件操作入门实战
元组可以把固定数量的条目组合在一起一遍作为整体传送。不像数组或列表,元组可以保存不同类型的对象。
由于元组可以组合不同类型的对象,因此它不能继承自Iterable。
元组常用来返回方法的多个值。
在sclal中有用的容器对象是元组: Tuple,与列表一样,元素也是不可变的,但与列表不同,在一个元组可以包含不同类型的元素,所以在scala用的非常多。
def main(args: Array[String]): Unit = {
val triple = (100, "Scala", "Spark");
println(triple._1)
println(triple._2)
println(triple._3)
}
}
打印元素通过元组名( 元组._1,元组._2,元组._3,元组._* ...)的方式打印出所选的元素。 得到以下返回结果:
100
Scala
Spark
元组可以同时拥有Int 和 String. 这点与java不同,如果在java中,需要经常创建一个javaBean的类去装多个返回值,而在Scala中就可以简单地额返回一个元组。这样做就简单了许多,实例化一个装有一些新对象的新元组,只要把这写对象放在括号里,并用逗号分隔即可。
要访问数组的元素,可以使用“元组名._1”访问第一个元素,“元组名._2”访问第二个元素,以此类推。
还可以把元组的每个元素赋值给它自己的变量。例如:
scala>val longest = ("quick",1)
scala>val (word,idx) = longest
word : String = quick
idx : Int = 1
如果去掉了括号,将得到不同的结果:
scala>val word,idx = (quick,1)
word:(String,Int) = (quick,1)
idx:(String,Int) = (quick,1)
这种语法对于多重定义指定了相同的表达式。每个变量被初始化为右侧表达式的单次执行结果,两个变量分别被初始化为互相独立的元组。
2.Array 数组
定长数组
如果要定义一个长度不变的数组,可以用Scala中的Array。例如:
//10个整数的数组,所有元素初始化为0
val nums = new Array[Int](10)
//长度为2的Array[String]——类型是推断出来的
//说明:已提供初始化值就不需要new
val s = Array("Hello","World");
在JVM中,Scala的Array以Java数组方式实现。Byte、Char、Short、Int、Long、Double、Float、Boolean与Java中基本类型对应的数组都是基本类型数组。
声明长度按需要变化的数组,Java有ArrayList,C++有vector。Scala中的等效数据结构为ArrayBuffer。语法如下:
//声明一个空的数据缓冲
import scala.collection.mutable.ArrayBuffer
val 数组名 = ArrayBuffer[数据类型]()
//或者
new ArrayBuffer[数据类型]
//用+=在尾端添加元素
数组名 += 数组值;
//在尾端添加多个元素,以括号包起来
数组名 += (数组值1,数组值2,...)
//用++=操作符追加任何集合
数组名 ++= Array(数组值1,数组值2,...)
//移除最后n个元素
数组名.trimEnd(个数)
在数组缓冲的尾端添加或移除元素是一个高效(“amortized constant time”)的操作。
也可以在任意位置插入或移除元素,但这样的操作并不那么高效——所有在那个位置之后的元素都必须被平移。语法如下:
数组名.insert(插入位置,数组值1,数组值2,...)
数组名.remove(要删除下标)
数组名.remove(开始删除下标,删除个数)
例如:
//初始值:ArrayBuffer(1,1,2)
//在下标2之前插入
b.insert(2,6)
//结果:ArrayBuffer(1,1,6,2)
b.insert(2,7,8,9)
结果:ArrayBuffer(1,1,7,8,9,6,2)
b.remove(2)
结果:ArrayBuffer(1,1,8,9,6,2)
b.remove(2,3)
结果:ArrayBuffer(1,1, 2)
定长数组Array和变长数组ArrayBuffer之间的转换方法:
Array => ArrayBuffer
a.toBuffer
ArrayBuffer => Array
a.toArray
变量定长数组和变长数组:
使用for循环遍历数组或数据缓冲的语法:
for(i <- 0 until 数组名.length)方法体
说明:变量i的取值从0到变量名.length - 1
until是RichInt类的方法,返回所有小于(但不包含)上限的数字。例如:
0 until 10
//Range(0,1,2,3,4,5,6,7,8,9)
注意:0 until 10 实际上是一个方法调用:0.until(10)。
如下结构:
for(i <- 区间)
会让遍历i遍历区间的所有值。
如果想要每两个元素一跳,可以让i这样来 遍历:
0 until (a.length,2)
//Range(0,2,4)
如果要从数组的尾端开始,遍历的写法为:
(0 until a.length).reverse
//Range(...,2,1,0)
如果在循环体中不需要用到数组下标,也可以直接访问数组元素。例如:
for(elem <- a)
println(elem)
这和Java中的“增强版”for循环,或者C++中的“基于区间的”for循环相似。变量elem先后被设置为a(0),然后a(1),以此类推。
scala里面的数组和java里面的比较类似,但是又有些不同,数组的初始化方法比java里面多了一种方式,具体如下:
def main(args: Array[String]): Unit = {
val array = Array(1, 2, 3, 4, 5)
for (i <- 0 to (array.length - 1)) {
println("i = " + array(i));
}
}
可以看出索引是从0开始的,到 (array的长度-1)结束的,这点和C,Java都是一样的。运行代码得到如下结果,打印出数组 array里的元素。
i = 1
i = 2
i = 3
i = 4
i = 5
也可以通过另外一种方式打印数组,通过 <-箭头访问数组,遍历数组里的元素。
def main(args: Array[String]): Unit = {
val array = Array(1, 2, 3, 4, 5)
for (elem <- array) {
println(elem);
}
}
3. Map 映射
Scala中的映射是键/值对的集合。任何值可以根据它的键进行检索。键是在映射唯一的,但值不一定是唯一的。映射也被称为哈希表。
def main(args: Array[String]): Unit = {
var ages = Map("Rocky" -> 27, "Spark" -> 5)
for ((k, v) <- ages) {
println("Key is " + k + ", value is " + v)
}
}
这段代码是打印出映射对应的key和value ,运行代码,得到以下结果:
Key is Rocky, value is 27
Key is Spark, value is 5
4. 文件的操作
1) 使用 scala.io包下的Source类读取硬盘上的具体文件,此处打印的是 d:\users.txt文件,读取每行的内容并打印到屏幕,代码如下所示:
import scala.io.Source
object Test {
def main(args: Array[String]): Unit = {
val file = Source.fromFile("d:\\users.txt")
for (line <- file.getLines()) {
println(line);
}
}
}
注意: 读取的文本文件要经过 UTF-8转码,否则很可能代码包 异常。
打印结果如下,和实际文件中的内容一致。
2)打印制定网址的内容
使用Source.formUrl()方法访问某个网站,读取网页内容并打印到屏幕。
import scala.io.Source
object Test {
def main(args: Array[String]): Unit = {
val file = Source.fromURL("https://www.taobao.com/")
for (line <- file.getLines()) {
println(line);
}
}
}